Estás trabajando sin conexión, espera a que vuelva la conexión a Internet

Cómo realizar la autenticación en Active Directory mediante la autenticación de formularios y Visual C#.

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
En este artículo se refiere a los siguientes espacios de nombres de biblioteca de clases de Microsoft.NET Framework:
  • System.Text
  • System.DirectoryServices
  • System.Security.Principal
  • System.Web.Security
Resumen
En este artículo paso a paso se muestra cómo una aplicación ASP.NET puede utilizar la autenticación de formularios para permitir que los usuarios se autentiquen en Active Directory utilizando el protocolo ligero de acceso a directorios (LDAP). Una vez que 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#.

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

Escriba 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 en el nodo del proyecto, Agregar, de aviso y, a continuación, haga clic en Agregar nuevo elemento.
  2. En plantillas, haga clic en clase .
  3. Escriba el LdapAuthentication.cs en el nombre y a continuación, haga clic en Abrir.
  4. Reemplace el código existente en el enviar el siguiente código de LdapAuthentication.cs.
    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 de acceso al árbol de Active Directory. Este código utiliza el proveedor del directorio LDAP.

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

Para obtener una lista de grupos a los 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 mediante la creación de un objeto DirectorySearcher y filtrado según el atributo memberOf . Este método devuelve una lista de grupos que se separa mediante canalizaciones (|).

Observe que el método LdapAuthentication.GetGroups se manipula y trunca las cadenas. Esto reduce la longitud de la cadena que se almacena en la cookie de autenticación. Si la cadena no se trunca, el formato de cada grupo se muestra a continuación.
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 se encuentra en un entorno de múltiples dominios, deberá mantener el nombre de dominio con el nombre del grupo, ya que los 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 hasta 4096 bytes. Si esta cadena potencialmente puede superar la longitud de la cookie, desea almacenar la información del grupo en el objeto Cache de ASP.NET o en una base de datos. O bien, desea cifrar la información del grupo y almacenar esta información en un campo de formulario oculto.

Escriba 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 de Context.Request.Cookies , descifra la cookie y recupera la lista de grupos que se almacenará en la propiedad FormsAuthenticationTicket.UserData . Los grupos aparecen en una lista separada de tubería 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 en Global.asaxy, a continuación, haga clic en Ver código.
  2. Agregue el código siguiente en la parte superior del archivo de código behindGlobal.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, se configura el <forms> </forms>, el <authentication> </authentication>y el <authorization></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 que 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>				
Aviso de la <identity impersonate="true"></identity> elemento de configuración. Esto hace que ASP.NET suplantar a la cuenta que se configura como la cuenta anónima de servicios de Microsoft Internet Information Services (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 las credenciales para autenticarse en Active Directory, pero la cuenta que tiene acceso a Active Directory es la cuenta configurada. Para obtener más información, consulte la Referencias 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 del equipo servidor, sitios Web, sitio Web predeterminado, haga clic en FormsAuthAdy, a continuación, haga clic en Propiedades.
  2. Haga clic en la Ficha seguridad de directorios y, a continuación, haga clic en Editar, bajo Control de autenticación y acceso anónimo.
  3. Hacer que la cuenta anónima para la aplicación de una cuenta que tenga permisos para Active Directory.
  4. Haga clic para desactivar la casilla de verificación Permitir que IIS controle las contraseñas.
  5. En la sección "Acceso autenticado", desactive la casilla de verificación "Autenticación de Windows integrada".
  6. Haga clic en Aceptar.
  7. Haga clic en aplicar
El valor predeterminado IUSR_NombreDeEquipo cuenta no tiene permiso para Active Directory.

Crear la página Logon.aspx

Siga estos pasos para crear un nuevo formulario Web de ASP.NET denominada Logon.aspx:
  1. En el Explorador de soluciones, haga clic en el nodo del proyecto, Agregar, de aviso y, a continuación, haga clic en Agregar formulario Web.
  2. Escriba el Logon.aspx en el nombre y a continuación, haga clic en Abrir.
  3. En el Explorador de soluciones, haga clic en Logon.aspxy, a continuación, haga clic en Diseñador de vistas.
  4. Haga clic en la ficha HTML en el diseñador.
  5. Reemplace el código existente con el código siguiente.
    <%@ 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. Modifique la ruta de acceso en la página Logon.aspx para apuntar al servidor de directorio de yourLDAP.
La página Logon.aspx es una página que recopila información de los métodos de usuario y la llamada a la clase LdapAuthentication . Después de que 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 en una cookie, la cookie agrega 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 solicitada originalmente. Cuando el usuario solicita esta página, la solicitud se redirige a la página Logon.aspx. Después de autentica la solicitud, la solicitud se redirige a la página WebForm1.aspx.
  1. En el Explorador de soluciones, haga clic en WebForm1.aspxy, 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 el código siguiente.
    <%@ 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. Guarde todos los archivos y, a continuación, compilar el proyecto.
  5. Solicite la página WebForm1.aspx. Observe areredirected a Logon.aspx.
  6. Escriba las credenciales de inicio de sesión y, a continuación, haga clic en Enviar. Cuando se le redirige a WebForm1.aspx, observe que aparece el nombre de usuario y ese LdapAuthentication es el tipo de autenticación para la propiedad Context.User.AuthenticationType .
Nota: Debido a que existen varias versiones de Microsoft Windows, los siguientes pasos pueden ser diferentes en su equipo. Microsoft recomienda que utilice el cifrado Secure Sockets Layer (SSL) cuando se utiliza la autenticación de formularios. Esto es porque el usuario se identifica en la cookie de autenticación y cifrado SSL en esta aplicación impide que alguien pueda poner en peligro la cookie de autenticación y cualquier otra información importante 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:
306590 Introducción a la seguridad ASP.NET
317012 Identidad de proceso y solicitud en ASP.NET
311495 Cómo implementar la seguridad basada en funciones con autenticación basada en formularios en su aplicación ASP.NET mediante Visual C#.
313091 Cómo crear claves utilizando Visual Basic .NET para uso en autenticación mediante formularios
313116 Las solicitudes de autenticación de formularios no se dirigen a la página loginUrl

Advertencia: este artículo se tradujo automáticamente

Propiedades

Id. de artículo: 316748 - Última revisión: 02/08/2015 06:17:00 - Revisión: 6.0

Microsoft Visual C# .NET 2003 Standard Edition, Microsoft Visual C# .NET 2002 Standard Edition, Microsoft ASP.NET 1.1, Microsoft ASP.NET 1.0

  • kbconfig kbcookie kbhowtomaster kbsecurity kbwebforms kbmt KB316748 KbMtes
Comentarios