domingo, 27 de diciembre de 2009

Autenticación en un ASPX con el acceso IFD activado

Al activar el acceso a través de IFD (Internet Facing Deployment) al CRM, lo que se permite es que los usuarios accedan al CRM a través de la autenticación por formulario. De esta forma, al acceder al CRM en vez de pedir la típica ventana de autenticación del directorio activo, aparece un formulario web, en donde hay que introducir usuario y contraseña. Esto suele utilizarse cuando se va habilitar acceso al CRM a través de internet desde diferentes ubicaciones.
Para ver como configurar el acceso a través de IFD recomiendo ir a:
http://support.microsoft.com/kb/948779

Una vez configurado y activos el acceso por IFD, se produce un cambio muy importante en el IIS (Internet Information Services) del servidor web, que habilita el acceso anonómimo al sitio web. De esta forma, el usuario que ejecuta la aplicación, es el usuario anónonimo y no el usuario conectado a traves de las credenciales del directorio activo.

Esto trae como consecuencia, que cualquier desarrollo web nuestro (formularios aspx) en los cuales nos hemos conectado a los web services de CRM mediante las "DefaulCredentials", provocará un error de autenticación ya que el usuario anónimo no es usuario de CRM.
Veamos como sería la autenticación en una implantación "On Premise" (sin IFD):

CrmService crmService = new CrmService();
crmService.Url = orgInfo.CrmServiceUrl;
crmService.CrmAuthenticationTokenValue = token;
crmService.Credentials = System.Net.CredentialCache.DefaultCredentials;

account account = new account();
account.name = "Nueva cuenta: " + DateTime.Now.TimeOfDay.ToString();
service.Create(account);

Como puede verse, simplemente se recogen las "DefaultCredentials" que son las del usuario conectado, ya que al no estar activado el acceso por IFD, el sitio web recoge las credenciales del usuario conectado del directorio activo.

En caso de activar el acceso por IFD, esas "DefaultCredentials" devuelven al usuario anónimo, por lo tanto da un error de autenticación.
La forma de hacer lo mismo en una implantación con IFD activado sería:

using (new CrmImpersonator())
{
CrmAuthenticationToken token;
token = CrmAuthenticationToken.ExtractCrmAuthenticationToken(Context, orgname);
token.OrganizationName = orgname;
token.AuthenticationType = 0;

CrmService service = new CrmService();
service.Credentials = System.Net.CredentialCache.DefaultCredentials;
service.CrmAuthenticationTokenValue = token;
service.Url = crmurl;

account account = new account();
account.name = "Nueva cuenta: " + DateTime.Now.TimeOfDay.ToString();
service.Create(account);
}

El "CrmImpersonator" lo que hace es que todo el código dentro del "using" se ejecute con el entorno del usuario conectado (usuario de CRM) y no con el usuario anónimo. De hecho, si quisiésemos recoger el id del usuario del CRM lo tenemos utilizando rl "token.CallerId".
De esta forma funcionaría nuestro código con IFD activado. De hecho este código funciona tando con "IFD" como con "On Premise", con lo cual sugiero que en vuestros desarrollos web, intenten utilizar este tipo de código, y que lo prueben bien, ya que nuestros desarrollos web pueden cambiar sus funcionamientos en caso de acceder a traves de IFD.

Espero les haya servido,

un abrazo

No hay comentarios:

Publicar un comentario