Está en la página 1de 10

Utilizar la autenticacin mediante Formularios con Active Directory

La autenticacin mediante Formularios de ASP.NET permite que los usuarios escriban sus credenciales (nombre de usuario y contrasea) en un formulario Web para identificarse. Al recibir las credenciales, la aplicacin Web puede autenticar al usuario mediante la comprobacin del nombre de usuario y de su contrasea en un conjunto de datos disponible. En este artculo se describe cmo autenticar usuarios en el servicio de directorio Microsoft Active Directory mediante el Protocolo ligero de acceso a directorios (LDAP). Tambin se describe cmo recuperar una lista de grupos de seguridad y listas de distribucin a los que pertenece el usuario, cmo almacenar esa informacin en un objeto GenericPrincipal y cmo almacenarla en la propiedad HttpContext.Current.User que acompaa a la solicitud a travs de la aplicacin Web ASP.NET. Posteriormente se puede utilizar para la autorizacin basada en funciones de .NET.

Requisitos
A continuacin se describen las recomendaciones de hardware, software, infraestructura de red, conocimientos y Service Pack que se necesitan. Sistema operativo Microsoft Windows 2000 Sistema de desarrollo Microsoft Visual Studio .NET Para llevar a cabo los procedimientos de este artculo, tambin es necesario que tenga conocimientos de la herramienta de desarrollo Microsoft Visual C#.

Resumen
En este artculo se incluyen los siguientes procedimientos: 1. Crear una aplicacin Web con una pgina de inicio de sesin 2. Configurar la aplicacin Web para la autenticacin mediante Formularios 3. Desarrollar cdigo de autenticacin LDAP para buscar el usuario en Active Directory 4. Desarrollar cdigo LDAP de recuperacin de grupos para consultar la pertenencia a grupos del usuario 5. Autenticar al usuario y crear un vale de autenticacin mediante Formularios 6. Implementar un controlador de solicitudes de autenticacin para construir un objeto GenericPrincipal 7. Probar la aplicacin

1. Crear una aplicacin Web con una pgina de inicio de sesin


En este procedimiento se crea una sencilla aplicacin Web en C#, la cual contiene una pgina de inicio de sesin que permite a los usuarios escribir un nombre de usuario y una contrasea, y una pgina predeterminada que muestra el nombre de la identidad e informacin de pertenencia a grupos asociada a la solicitud Web actual. Para crear una aplicacin Web con una pgina de inicio de sesin 1. Inicie Visual Studio .NET y cree una nueva aplicacin Web ASP.NET en C# con el nombre FormsAuthAD. 2. Utilice el Explorador de soluciones para cambiar el nombre de WebForm1.aspx por Logon.aspx. 3. Agregue una nueva referencia de ensamblado a System.DirectoryServices.dll. Esto proporciona acceso al espacio de nombres System.DirectoryServices que contiene tipos administrados como ayuda en la consulta y tratamiento en Active Directory. 4. Agregue a Logon.aspx los controles que se enumeran en la tabla 1 para crear un sencillo formulario de inicio de sesin. Tabla 1: Controles de Logon.aspx Tipo de control
Etiqueta Etiqueta Etiqueta Cuadro de texto Cuadro de texto Cuadro de texto Botn Etiqueta

Texto
Domain Name: User Name: Password Log On

Id.
txtDomainName txtUserName txtPassword btnLogon lblError

5. Establezca el valor Password en la propiedad TextMode de txtPassword. 6. En el Explorador de soluciones, haga clic con el botn secundario del mouse (ratn) en FormsAuthAd, seleccione Agregar y, despus, haga clic en Agregar formulario Web. 7. En el campo Nombre, escriba default.aspx y, a continuacin, haga clic en Abrir. 8. En el Explorador de soluciones, haga clic con el botn secundario en default.aspx y, a continuacin, haga clic en Establecer como pgina de inicio. 9. Haga doble clic en default.aspx para mostrar el controlador de eventos de carga de la pgina. 10. Agregue el siguiente cdigo al controlador de eventos para mostrar el nombre de identidad asociado a la solicitud Web actual.
Response.Write( HttpContext.Current.User.Identity.Name );

2. Configurar la aplicacin Web para la autenticacin mediante Formularios


En este procedimiento se modifica el archivo Web.config de la aplicacin para configurarla de forma que admita la autenticacin mediante Formularios. Para configurar la aplicacin Web para la autenticacin mediante Formularios 1. Utilice el Explorador de soluciones para abrir Web.config. 2. Busque el elemento <authentication> y cambie el atributo mode a Forms. 3. Agregue el elemento <forms> siguiente como elemento secundario del elemento de autenticacin y configure los atributos loginUrl, name, timeout y path como se muestra a continuacin.
<authentication mode="Forms"> <forms loginUrl="logon.aspx" name="adAuthCookie" timeout="60" path="/"> </forms> </authentication>

4. Agregue el siguiente elemento <authorization> debajo del elemento <authentication>. Esto permitir que slo los usuarios autenticados tengan acceso a la aplicacin. El atributo loginUrl del elemento <authentication> establecido anteriormente redirigir las solicitudes no autenticadas a la pgina logon.aspx.
<authorization> <deny users="?" /> <allow users="*" /> </authorization>

5. Guarde Web.config. 6. Inicie el complemento Microsoft Management Console (MMC) de IIS. 7. Haga clic con el botn secundario en el directorio virtual de la aplicacin y, despus, haga clic en Propiedades. 8. Haga clic en la ficha Seguridad de directorios y, despus, en el botn Modificar del grupo Acceso annimo y control de autenticacin. 9. Active la casilla de verificacin Acceso annimo y desactive la casilla Permitir que IIS controle las contraseas. 10. Puesto que la cuenta annima predeterminada IUSR_MACHINE no cuenta con permiso para tener acceso a Active Directory, cree una nueva cuenta con privilegios mnimos y especifique los detalles de la cuenta en el cuadro de dilogo Mtodos de autenticacin. 11. Haga clic en Aceptar y, a continuacin, de nuevo en Aceptar para cerrar el cuadro de dilogo Propiedades. 12. Vuelva a Visual Studio .NET y agregue un elemento <identity> debajo del elemento <authorization> en Web.config, y configure el atributo de suplantacin en true. De esta manera, ASP.NET suplantar la cuenta annima especificada anteriormente.
<identity impersonate="true" />

Como resultado de esta configuracin, todas las solicitudes dirigidas a la aplicacin se ejecutarn en el contexto de seguridad de la cuenta annima configurada. El usuario proporcionar credenciales a travs del formulario Web para autenticarse en Active Directory, pero la cuenta que se utilizar para tener acceso a Active Directory ser la cuenta annima configurada.

3. Desarrollar cdigo de autenticacin LDAP para buscar el usuario en Active Directory


En este procedimiento se agrega una nueva clase auxiliar a la aplicacin Web para encapsular el cdigo LDAP. La clase proporcionar inicialmente un mtodo IsAuthenticated para validar un dominio, un nombre de usuario y una contrasea suministrados con un objeto de usuario de Active Directory. Para desarrollar cdigo de autenticacin LDAP para buscar el usuario en Active Directory 1. Agregue un nuevo archivo de clase de C# con el nombre LdapAuthentication.cs. 2. Agregue una referencia al ensamblado System.DirectoryServices.dll. 3. Agregue las siguientes instrucciones using al principio del archivo LdapAuthentication.cs.
using System.Text; using System.Collections; using System.DirectoryServices;

4. Cambie el nombre del espacio de nombres existente a FormsAuthAD. 5. Agregue dos cadenas privadas a la clase LdapAuthentication: una para contener la ruta de acceso LDAP de Active Directory y la otra para contener un atributo de filtro utilizado para buscar en Active Directory.
private string _path; private string _filterAttribute;

6. Agregue un constructor pblico que se pueda utilizar para inicializar la ruta de acceso de Active Directory.
public LdapAuthentication(string path) { _path = path; }

7. Agregue el siguiente mtodo IsAuthenticated que acepta un nombre de dominio, un nombre de usuario y una contrasea como parmetros, y que devuelve un valor de tipo bool para indicar si el usuario que tiene una contrasea coincidente existe en Active Directory. Inicialmente, el mtodo intenta enlazar con Active Directory mediante las credenciales suministradas. Si tiene xito, el mtodo utiliza la clase administrada DirectorySearcher para buscar el objeto de usuario especificado. Si se encuentra, el miembro _path se actualiza para que apunte al objeto de usuario y el miembro _filterAttribute se actualiza con el atributo de nombre comn del objeto de usuario.

public bool IsAuthenticated(string domain, string username, string pwd) { string domainAndUsername = domain + @"\" + username; DirectoryEntry entry = new DirectoryEntry( _path, domainAndUsername, pwd); try { // Bind to the native AdsObject to force authentication. Object obj = entry.NativeObject; DirectorySearcher search = new DirectorySearcher(entry); search.Filter = "(SAMAccountName=" + username + ")"; search.PropertiesToLoad.Add("cn"); SearchResult result = search.FindOne(); if(null == result) { return false; } // Update the new path to the user in the directory _path = result.Path; _filterAttribute = (String)result.Properties["cn"][0]; } catch (Exception ex) { throw new Exception("Error authenticating user. " + ex.Message); } return true; }

4. Desarrollar cdigo LDAP de recuperacin de grupos para consultar la pertenencia a grupos del usuario
En este procedimiento se ampla la clase LdapAuthentication para proporcionar un mtodo GetGroups que recuperar la lista de grupos de los que es miembro el usuario actual. El mtodo GetGroups devolver la lista de grupos como una cadena, donde cada grupo vendra delimitado por el carcter |, como se indica a continuacin.
"Group1|Group2|Group3|"

Para desarrollar cdigo LDAP de recuperacin de grupos para consultar la pertenencia a grupos del usuario 1. Agregue la siguiente implementacin del mtodo GetGroups a la clase LdapAuthentication.
public string GetGroups() { DirectorySearcher search = new DirectorySearcher(_path); search.Filter = "(cn=" + _filterAttribute + ")"; search.PropertiesToLoad.Add("memberOf");

StringBuilder groupNames = new StringBuilder(); try { SearchResult result = search.FindOne(); int propertyCount = result.Properties["memberOf"].Count; String dn; int equalsIndex, commaIndex; for( int propertyCounter = 0; propertyCounter < propertyCount; propertyCounter++) { dn = (String)result.Properties["memberOf"][propertyCounter]; equalsIndex = dn.IndexOf("=", 1); commaIndex = dn.IndexOf(",", 1); if (-1 == equalsIndex) { return null; } groupNames.Append(dn.Substring((equalsIndex + 1), (commaIndex - equalsIndex) - 1)); groupNames.Append("|"); } } catch (Exception ex) { throw new Exception("Error obtaining group names. " + ex.Message); } return groupNames.ToString(); }

5. Autenticar al usuario y crear un vale de autenticacin mediante Formularios


En este procedimiento se implementa el controlador de eventos btnLogon_Click para autenticar a los usuarios. Para los usuarios autenticados, se crear despus un vale de autenticacin mediante Formularios que contenga la lista de grupos del usuario. A continuacin se redirigir al usuario a la pgina original que solicit (antes de la redireccin a la pgina de inicio de sesin). Para autenticar al usuario y crear un vale de autenticacin mediante Formularios 1. Vuelva al formulario Logon.aspx y haga doble clic en el botn Log On para crear un controlador de eventos vaco con el nombre btnLogon_Click. 2. Al principio del archivo, agregue la siguiente instruccin using debajo de las instrucciones using existentes. De esta manera se proporciona acceso a los mtodos FormsAuthentication.
using System.Web.Security;

3. Agregue cdigo para crear una nueva instancia de la clase LdapAuthentication inicializada de forma que apunte a Active Directory en el servidor LDAP, como se muestra en el cdigo siguiente. Recuerde que debe cambiar la ruta de acceso para que apunte al servidor de Active Directory.
// Path to you LDAP directory server. // Contact your network administrator to obtain a valid path. string adPath = "LDAP://yourCompanyName.com/DC=yourCompanyName,DC=com"; LdapAuthentication adAuth = new LdapAuthentication(adPath);

4. Agregue el cdigo que se incluye a continuacin para realizar los siguientes pasos: a. Autenticar al llamador con Active Directory. b. Recuperar la lista de grupos de los que el usuario es miembro. c. Crear un vale FormsAuthenticationTicket que contenga la lista de grupos. d. Cifrar el vale. e. Crear una cookie nueva que contenga el vale cifrado. f. Agregar la cookie a la lista de cookies que se devuelven al explorador del usuario.
try { if(true == adAuth.IsAuthenticated(txtDomainName.Text, txtUserName.Text, txtPassword.Text)) { // Retrieve the user's groups string groups = adAuth.GetGroups(); // Create the authetication ticket FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(1, // version txtUserName.Text, DateTime.Now, DateTime.Now.AddMinutes(60), false, groups); // Now encrypt the ticket. string encryptedTicket = FormsAuthentication.Encrypt(authTicket); // Create a cookie and add the encrypted ticket to the // cookie as data. HttpCookie authCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket); // Add the cookie to the outgoing cookies collection. Response.Cookies.Add(authCookie); // Redirect the user to the originally requested page Response.Redirect( FormsAuthentication.GetRedirectUrl(txtUserName.Text, false));

} else { lblError.Text = "Authentication failed, check username and password."; } } catch (Exception ex) { lblError.Text = "Error authenticating. " + ex.Message; }

6. Implementar un controlador de solicitudes de autenticacin para construir un objeto GenericPrincipal


En este procedimiento se implementa el controlador de eventos Application_AuthenticateRequest en global.asax y se crea un objeto GenericPrincipal para el usuario autenticado actualmente. Contendr la lista de grupos de los que es miembro el usuario, recuperada en el vale FormsAuthenticationTicket contenido en la cookie de autenticacin. Por ltimo, se asociar el objeto GenericPrincipal con el objeto HttpContext actual que se crea para cada solicitud Web. Para implementar un controlador de solicitudes de autenticacin para construir un objeto GenericPrincipal 1. Utilice el Explorador de soluciones para abrir global.asax.cs. 2. Agregue las siguientes instrucciones using al principio del archivo.
using System.Web.Security; using System.Security.Principal;

3. Busque el controlador de eventos Application_AuthenticateRequest y agregue el siguiente cdigo para obtener la cookie que contiene el vale FormsAuthenticationTicket cifrado en la coleccin de cookies pasada con la solicitud.
// Extract the forms authentication cookie string cookieName = FormsAuthentication.FormsCookieName; HttpCookie authCookie = Context.Request.Cookies[cookieName]; if(null == authCookie) { // There is no authentication cookie. return; }

4. Agregue el siguiente cdigo para extraer el vale FormsAuthenticationTicket de la cookie y descifrarlo.


FormsAuthenticationTicket authTicket = null; try

{ authTicket = FormsAuthentication.Decrypt(authCookie.Value); } catch (Exception ex) { // Log exception details (omitted for simplicity) return; } if (null == authTicket) { // Cookie failed to decrypt. return; }

5. Agregue el siguiente cdigo para analizar la lista de nombres de grupos separados por el smbolo | que se adjunt al vale cuando el usuario se autentic originalmente.
// When the ticket was created, the UserData property was assigned a // pipe delimited string of group names. String[] groups = authTicket.UserData.Split(new char[]{'|'});

6. Agregue el siguiente cdigo para crear un objeto GenericIdentity con el nombre de usuario obtenido en el nombre del vale y un objeto GenericPrincipal que contenga esa identidad junto con la lista de grupos del usuario.
// Create an Identity object GenericIdentity id = new GenericIdentity(authTicket.Name, "LdapAuthentication"); // This principal will flow throughout the request. GenericPrincipal principal = new GenericPrincipal(id, groups); // Attach the new principal object to the current HttpContext object Context.User = principal;

7. Probar la aplicacin
En este procedimiento se utiliza la aplicacin Web para solicitar la pgina default.aspx. Se le redirigir a la pgina de inicio de sesin para llevar a cabo la autenticacin. Una vez realizada correctamente la autenticacin, se redirigir el explorador a la pgina default.aspx solicitada originalmente. De esta forma se extraer y mostrar la lista de grupos a los que pertenece el usuario autenticado del objeto GenericPrincipal que se ha asociado a la solicitud actual en el proceso de autenticacin. Para probar la aplicacin 1. En el men Generar, haga clic en Generar solucin. 2. En el Explorador de soluciones, haga clic con el botn secundario en default.aspx y, a continuacin, haga clic en Ver en el explorador.

3. Escriba un nombre de dominio (Domain Name), un nombre de usuario (User Name) y una contrasea (Password) vlidos y, despus, haga clic en Log on (Iniciar sesin). 4. Si se autentica correctamente, debe producirse de nuevo la redireccin a default.aspx. El cdigo de esta pgina debe mostrar el nombre de usuario del usuario autenticado. Para ver la lista de grupos de los que es miembro el usuario autenticado, agregue el siguiente cdigo al final del controlador de eventos Application_AuthenticateRequest en el archivo global.aspx.cs.
Response.Write("Groups: " + authTicket.UserData + "<br>");

10

También podría gustarte