Cómo autenticar en Active Directory mediante autenticación de formularios y Visual C# .NET

Seleccione idioma Seleccione idioma
Id. de artículo: 316748 - Ver los productos a los que se aplica este artículo
Este artículo hace referencia a los siguientes espacios de nombres de la Biblioteca de clases de Microsoft .NET Framework:
  • System.Text
  • System.DirectoryServices
  • System.Security.principal
  • System.Web.Security
Expandir todo | Contraer todo

En esta página

Resumen

En este artículo paso a paso se demuestra cómo ASP.NET aplicación puede utilizar autenticación de formularios para permitir que los usuarios autenticarse en Active Directory mediante el protocolo ligero de acceso a directorios (LDAP). Después el usuario se autentica y redirige, puede utilizar el método Application_AuthenticateRequest del archivo global.asax para almacenar un objeto GenericPrincipal en la propiedad HttpContext.User que fluye a través de la solicitud.

Crear una aplicación Web ASP.NET en Visual C# .NET

Siga estos pasos para crear una nueva aplicación Web ASP.NET denominada FormsAuthAd en Visual C#. NET:
  1. Inicie Microsoft Visual Studio NET..
  2. En el menú archivo , seleccione nuevo y, a continuación, haga clic en proyecto .
  3. Haga clic en Proyectos de Visual C# en Tipos de proyecto y, a continuación, haga clic en Aplicación Web ASP.NET bajo plantillas .
  4. En el cuadro ubicación , reemplace WebApplication1 con FormsAuthAd .
  5. Haga clic en Aceptar .
  6. Haga clic con el botón secundario en el nodo referencias en el Explorador de soluciones y, a continuación, haga clic en Agregar referencia .
  7. En la ficha .NET del cuadro de diálogo Agregar referencia , haga clic en System.DirectoryServices.dll , haga clic en Seleccionar y, a continuación, haga clic en Aceptar .

Escribir el código de autenticación

Siga estos pasos para crear un nuevo archivo de clase denominado LdapAuthentication.cs:
  1. En el Explorador de soluciones, haga clic con el botón secundario del mouse en el nodo del proyecto, elija Agregar y, a continuación, haga clic en Agregar nuevo elemento .
  2. Haga clic en clase bajo plantillas .
  3. Escriba LdapAuthentication.cs en el cuadro nombre y, a continuación, haga clic en Abrir .
  4. Reemplace el código existente en el archivo LdapAuthentication.cs con el código siguiente.
    using System;
    using System.Text;
    using System.Collections;
    using System.DirectoryServices;
    
    namespace FormsAuth
    {	
      public class LdapAuthentication
      {
        private String _path;
        private String _filterAttribute;
    
        public LdapAuthentication(String path)
        {
          _path = path;
        }
    		
        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;
         }
    
         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();
         }
       }
    }
    					
El código de autenticación acepta un dominio, un nombre de usuario, una contraseña y una ruta para el árbol de Active Directory. Este código utiliza el proveedor de directorio LDAP.

El código en la página Logon.aspx llama al método LdapAuthentication.IsAuthenticated y pasa las credenciales que se recopilan del usuario. A continuación, se crea un objeto DirectoryEntry con la ruta de acceso al árbol de directorios, el nombre de usuario y la contraseña. El nombre de usuario debe estar en el formato "dominio\nombreDeUsuario". A continuación, el objeto DirectoryEntry intenta obligar al enlace de AdsObject obteniendo la propiedad NativeObject . Si lo consigue, el atributo CN para el usuario se obtiene creando un objeto DirectorySearcher y filtrando el SAMAccountName . Una vez autenticado el usuario, el método IsAuthenticated devuelve true .

Para obtener una lista de grupos que pertenece el usuario, este código llama al método LdapAuthentication.GetGroups . El método LdapAuthentication.GetGroups obtiene una lista de grupos de seguridad y de distribución que pertenece el usuario para crear un objeto DirectorySearcher y filtrado de acuerdo con el atributo memberOf . Este método devuelve una lista de grupos que se separa mediante canalización (|).

Observe que el método LdapAuthentication.GetGroups manipula y trunca cadenas. Esto reduce la longitud de la cadena que se almacena en la cookie de autenticación. Si no se trunque la cadena, el formato de cada grupo aparece como sigue.
CN=...,...,DC=domain,DC=com
				
Esto puede crear una cadena muy larga. Si la longitud de esta cadena es mayor que la longitud de la cookie, los exploradores no pueden aceptar la cookie de autenticación y se le redirigirá a la página de inicio de sesión. Sin embargo, si están en un entorno con varios dominios, quizás tenga que mantener el nombre de dominio con el nombre de grupo porque grupos en dominios diferentes pueden tener el mismo nombre de grupo. Tiene que mantener el nombre de dominio para diferenciar un grupo de otro.

La mayoría de los exploradores admiten cookies de 4096 bytes. Si esta cadena puede potencialmente superan la longitud de la cookie, quizás desee almacenar la información de grupo en el objeto Cache de ASP.NET o en una base de datos. Como alternativa, puede que desee cifrar la información de grupo y almacenar esta información en un campo de formulario oculto.

Escribir el código de global.asax

El código en el archivo global.asax proporciona un controlador de eventos Application_AuthenticateRequest . Este controlador de eventos recupera la cookie de autenticación de la colección Context.Request.Cookies , descifra la cookie y recupera la lista de grupos que se almacenarán en la propiedad FormsAuthenticationTicket.UserData . Los grupos aparecen en una lista separada por canalización que se crea en la página Logon.aspx.

El código analiza la cadena en una matriz de cadenas para crear un objeto GenericPrincipal . Una vez creado el objeto GenericPrincipal , este objeto se coloca en la propiedad HttpContext.User .
  1. En el Explorador de soluciones, haga clic con el botón secundario del mouse en global.asax y, a continuación, haga clic en Ver código .
  2. Agregue el código siguiente en la parte superior del código - detrás archivo global.asax.cs:
    using System.Web.Security;
    using System.Security.Principal;
    					
  3. Reemplace el controlador de eventos vacío existente para el Application_AuthenticateRequest con el código siguiente.
    void Application_AuthenticateRequest(Object sender, EventArgs e)
    {
      String cookieName = FormsAuthentication.FormsCookieName;
      HttpCookie authCookie = Context.Request.Cookies[cookieName];
    
      if(null == authCookie)
      {//There is no authentication cookie.
        return;
      }	
    		
      FormsAuthenticationTicket authTicket = null;
    	
      try
      {
        authTicket = FormsAuthentication.Decrypt(authCookie.Value);
      }
      catch(Exception ex)
      {
        //Write the exception to the Event Log.
        return;
      }
    	
      if(null == authTicket)
      {//Cookie failed to decrypt.
        return;		
      }		
    	
      //When the ticket was created, the UserData property was assigned a
      //pipe-delimited string of group names.
      String[] groups = authTicket.UserData.Split(new char[]{'|'});
    
      //Create an Identity.
      GenericIdentity id = new GenericIdentity(authTicket.Name, "LdapAuthentication");
    	
      //This principal flows throughout the request.
      GenericPrincipal principal = new GenericPrincipal(id, groups);
    
      Context.User = principal;
    	
    }
    					

Modificar el archivo Web.config

En esta sección, puede configurar el <forms>, el <authentication> y el <authorization> elementos en el archivo Web.config. Con estos cambios, sólo los usuarios autenticados pueden tener acceso a la aplicación y las solicitudes no autenticadas se redirigen a una página Logon.aspx. Puede modificar esta configuración para permitir sólo determinados usuarios y acceso de grupos a la aplicación.

Reemplace el código existente en el archivo Web.config con el código siguiente.
<?xml version="1.0" encoding="utf-8" ?>
<configuration>    
  <system.web>
    <authentication mode="Forms">
      <forms loginUrl="logon.aspx" name="adAuthCookie" timeout="10" path="/" >
      </forms>
    </authentication>	
    <authorization>	
      <deny users="?" />
      <allow users="*" />
    </authorization>	
    <identity impersonate="true" />
  </system.web>
</configuration>
				
Observe el <identity impersonate="true" /> elemento de configuración. Esto hace que ASP.NET para suplantar la cuenta que está configurada como cuenta anónima de servicios de Internet Information Server (IIS). Como resultado de esta configuración, todas las solicitudes a esta aplicación se ejecutan bajo el contexto de seguridad de la cuenta configurada. El usuario proporciona credenciales para autenticar en Active Directory, pero la cuenta que tiene acceso a Active Directory es la cuenta configurada. Para obtener más información, vea References sección.

Configurar IIS para la autenticación anónima

Para configurar IIS para la autenticación anónima, siga estos pasos:
  1. En IIS, expanda el nodo equipo para el servidor, expanda sitios Web , expanda sitio Web predeterminado , haga clic con el botón secundario del mouse en FormsAuthAd y, a continuación, haga clic en Propiedades .
  2. Haga clic en la Ficha seguridad de directorio y, a continuación, haga clic en Editar bajo control de autenticación y acceso anónimo .
  3. Asegúrese de la cuenta anónima para la aplicación de una cuenta que tenga permiso para Active Directory.
  4. Haga clic para desactivar la casilla de verificación contraseña de control de IIS en permitir.
  5. En la sección ? acceso autenticado ?, desactive la casilla de verificación ? autenticación integrada de Windows ?.
  6. Haga clic en Aceptar.
  7. Haga clic en aplicar
La cuenta predeterminada IUSR_ computername no tiene permiso para Active Directory.

Crear la página Logon.aspx

Siga estos pasos para crear un nuevo formulario de Web de ASP.NET denominada Logon.aspx:
  1. En el Explorador de soluciones, haga clic con el botón secundario del mouse en el nodo del proyecto, elija Agregar y, a continuación, haga clic en Agregar Web Forms .
  2. Escriba Logon.aspx en el cuadro nombre y, a continuación, haga clic en Abrir .
  3. En el Explorador de soluciones, haga clic con el botón secundario del mouse en Logon.aspx y, a continuación, haga clic en Diseñador de vistas .
  4. Haga clic en la ficha HTML en el diseñador.
  5. Replace the existing code with the following code.
    <%@ Page language="c#" AutoEventWireup="true" %>
    <%@ Import Namespace="FormsAuth" %>
    <html>
      <body>	
        <form id="Login" method="post" runat="server">
          <asp:Label ID="Label1" Runat=server >Domain:</asp:Label>
          <asp:TextBox ID="txtDomain" Runat=server ></asp:TextBox><br>    
          <asp:Label ID="Label2" Runat=server >Username:</asp:Label>
          <asp:TextBox ID=txtUsername Runat=server ></asp:TextBox><br>
          <asp:Label ID="Label3" Runat=server >Password:</asp:Label>
          <asp:TextBox ID="txtPassword" Runat=server TextMode=Password></asp:TextBox><br>
          <asp:Button ID="btnLogin" Runat=server Text="Login" OnClick="Login_Click"></asp:Button><br>
          <asp:Label ID="errorLabel" Runat=server ForeColor=#ff3300></asp:Label><br>
          <asp:CheckBox ID=chkPersist Runat=server Text="Persist Cookie" />
        </form>	
      </body>
    </html>
    <script runat=server>
    void Login_Click(Object sender, EventArgs e)
    {
      String adPath = "LDAP://corp.com"; //Fully-qualified Domain Name
      LdapAuthentication adAuth = new LdapAuthentication(adPath);
      try
      {
        if(true == adAuth.IsAuthenticated(txtDomain.Text, txtUsername.Text, txtPassword.Text))
        {
          String groups = adAuth.GetGroups();
    
          //Create the ticket, and add the groups.
          bool isCookiePersistent = chkPersist.Checked;
          FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(1,  txtUsername.Text,
    	DateTime.Now, DateTime.Now.AddMinutes(60), isCookiePersistent, groups);
    	
          //Encrypt the ticket.
          String encryptedTicket = FormsAuthentication.Encrypt(authTicket);
    		
          //Create a cookie, and then add the encrypted ticket to the cookie as data.
          HttpCookie authCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);
    
          if(true == isCookiePersistent)
    	authCookie.Expires = authTicket.Expiration;
    				
          //Add the cookie to the outgoing cookies collection.
          Response.Cookies.Add(authCookie);		
    
          //You can redirect now.
          Response.Redirect(FormsAuthentication.GetRedirectUrl(txtUsername.Text, false));
        }
        else
        {
          errorLabel.Text = "Authentication did not succeed. Check user name and password.";
        }
      }
      catch(Exception ex)
      {
        errorLabel.Text = "Error authenticating. " + ex.Message;
      }
    }
    </script>
  6. Modificar la ruta de acceso en la página Logon.aspx para apuntar a su servidor de directorio LDAP.
La página Logon.aspx es una página que recopila la información de los métodos de usuario y la llamada en la clase LdapAuthentication . Después el código autentica al usuario y obtiene una lista de grupos, el código crea un objeto FormsAuthenticationTicket , cifra el vale, agrega el vale cifrado a una cookie, agrega la cookie a la colección HttpResponse.Cookies y, a continuación, redirige la solicitud a la dirección URL que se solicitó originalmente.

Modificar la página WebForm1.aspx

La página WebForm1.aspx es la página que se solicitó originalmente. Cuando el usuario solicita esta página, la solicitud se redirige a Logon.aspx la página. Después de la solicitud se autentica, la solicitud se redirige a la página WebForm1.aspx.
  1. En el Explorador de soluciones, haga clic con el botón secundario del mouse en WebForm1.aspx y, a continuación, haga clic en Diseñador de vistas .
  2. Haga clic en la ficha HTML en el diseñador.
  3. Reemplace el código existente con la siguiente code.
    <%@ Page language="c#" AutoEventWireup="true" %>
    <%@ Import Namespace="System.Security.Principal" %>
    <html>
      <body>	
        <form id="Form1" method="post" runat="server">
          <asp:Label ID="lblName" Runat=server /><br>
          <asp:Label ID="lblAuthType" Runat=server />
        </form>	
      </body>
    </html>
    <script runat=server>
    void Page_Load(Object sender, EventArgs e)
    {
      lblName.Text = "Hello " + Context.User.Identity.Name + ".";
      lblAuthType.Text = "You were authenticated using " +   Context.User.Identity.AuthenticationType + ".";
    }
    </script>
    					
  4. Guardar todos los archivos y, a continuación, compile el proyecto.
  5. Solicitar la página WebForm1.aspx. Observe que se le redirige a Logon.aspx.
  6. Escriba las credenciales de inicio de sesión y, a continuación, haga clic en Enviar . Cuando se redirigen a WebForm1.aspx, observe que aparece su nombre de usuario y que LdapAuthentication es la autenticación de tipo para la propiedad Context.User.AuthenticationType .
Nota Microsoft recomienda que utilice Secure Sockets Layer (SSL) cifrado al utiliza la autenticación mediante formularios. Esto es porque el usuario se identifica según la cookie de autenticación y cifrado de SSL en esta aplicación evita que cualquiera poner en peligro la cookie de autenticación y otra información valiosa que se transmiten.

Referencias

Para obtener más información, haga clic en los números de artículo siguientes para verlos en Microsoft Knowledge Base:
306590Introducción a la seguridad de ASP.NET
317012Identidad de proceso y solicitud en ASP.NET
311495Cómo implementar seguridad basada en funciones con autenticación basada en formularios en su aplicación ASP.NET utilizando Visual C# .NET
313091Cómo crear claves utilizando Visual Basic .NET para uso en autenticación mediante formularios
313116Las solicitudes de autenticación de formularios no se dirigen a la página loginUrl

Propiedades

Id. de artículo: 316748 - Última revisión: martes, 16 de octubre de 2007 - Versión: 5.4
La información de este artículo se refiere a:
  • Microsoft Visual C# .NET 2003 Standard Edition
  • Microsoft Visual C# .NET 2002 Standard Edition
  • Microsoft ASP.NET 1.1
  • Microsoft ASP.NET 1.0
Palabras clave: 
kbmt kbconfig kbcookie kbhowtomaster kbsecurity kbwebforms KB316748 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 316748

Enviar comentarios

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com