Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Ldap
Ldap
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
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 );
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.
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(); }
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; }
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; }
{ 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