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

Seleccione idioma Seleccione idioma
Id. de artículo: 326340 - Ver los productos a los que se aplica este artículo
Expandir todo | Contraer todo

En esta página

Resumen

Este artículo paso a paso se describe cómo un ASP.NET aplicación 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).

Después de que el usuario está autenticado y se 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 Basic .NET

Siga estos pasos para crear una nueva aplicación Web ASP.NET denominada FormsAuthAd en Visual Basic. NET:
  1. Inicie Microsoft Visual Studio. NET.
  2. En el menú archivo , elija nuevoy, a continuación, haga clic en proyecto.
  3. Haga clic en Proyectos de Visual Basic en Tipos de proyectoy, a continuación, haga clic en Aplicación Web de ASP.NET en plantillas.
  4. En el cuadro ubicación , escriba http://<servername>/FormsAuthAd</servername> (reemplazando http://localhost si utiliza el servidor local (con el fin de tener http://localhost/FormsAuthAdy, a continuación, haga clic en Aceptar.
  5. Haga clic en el nodo referencias del explorador de soluciones y, a continuación, haga clic en Agregar referencia.
  6. 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.

Escribir el código de autenticación

Siga estos pasos para crear un nuevo archivo de clase denominado LdapAuthentication.vb:
  1. En el Explorador de soluciones, haga clic en el nodo del proyecto, seleccione para Agregary, a continuación, haga clic en Agregar nuevo elemento.
  2. En plantillas, haga clic en clase .
  3. Tipo LdapAuthentication.vb en el nombre de la caja y, a continuación, haga clic en Abrir.
  4. Reemplace el código existente en el archivo LdapAuthentication.vb con el código siguiente:
    Imports System
    Imports System.Text
    Imports System.Collections
    Imports System.DirectoryServices
    
    Namespace FormsAuth
        Public Class LdapAuthentication
    
            Dim _path As String
            Dim _filterAttribute As String
    
            Public Sub New(ByVal path As String)
                _path = path
            End Sub
    
            Public Function IsAuthenticated(ByVal domain As String, ByVal username As String, ByVal pwd As String) As Boolean
    
                Dim domainAndUsername As String = domain & "\" & username
                Dim entry As DirectoryEntry = New DirectoryEntry(_path, domainAndUsername, pwd)
    
                Try
                    'Bind to the native AdsObject to force authentication.			
                    Dim obj As Object = entry.NativeObject
                    Dim search As DirectorySearcher = New DirectorySearcher(entry)
    
                    search.Filter = "(SAMAccountName=" & username & ")"
                    search.PropertiesToLoad.Add("cn")
                    Dim result As SearchResult = search.FindOne()
    
                    If (result Is Nothing) Then
                        Return False
                    End If
    
                    'Update the new path to the user in the directory.
                    _path = result.Path
                    _filterAttribute = CType(result.Properties("cn")(0), String)
    
                Catch ex As Exception
                    Throw New Exception("Error authenticating user. " & ex.Message)
                End Try
    
                Return True
            End Function
    
            Public Function GetGroups() As String
                Dim search As DirectorySearcher = New DirectorySearcher(_path)
                search.Filter = "(cn=" & _filterAttribute & ")"
                search.PropertiesToLoad.Add("memberOf")
                Dim groupNames As StringBuilder = New StringBuilder()
    
                Try
                    Dim result As SearchResult = search.FindOne()
                    Dim propertyCount As Integer = result.Properties("memberOf").Count
    
                    Dim dn As String
                    Dim equalsIndex, commaIndex
    
                    Dim propertyCounter As Integer
    
                    For propertyCounter = 0 To propertyCount - 1
                        dn = CType(result.Properties("memberOf")(propertyCounter), String)
    
                        equalsIndex = dn.IndexOf("=", 1)
                        commaIndex = dn.IndexOf(",", 1)
                        If (equalsIndex = -1) Then
                            Return Nothing
                        End If
    
                        groupNames.Append(dn.Substring((equalsIndex + 1), (commaIndex - equalsIndex) - 1))
                        groupNames.Append("|")
                    Next
    
                Catch ex As Exception
                    Throw New Exception("Error obtaining group names. " & ex.Message)
                End Try
    
                Return groupNames.ToString()
            End Function
        End Class
    End Namespace
    
    
    					

Explicación del código

El código de autenticación acepta un dominio, un nombre de usuario, un contraseña y una ruta de acceso al árbol de Active Directory. Este código utiliza el Proveedor de directorio LDAP.
Autenticación de usuario
El código en 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 al árbol de directorios, el usuario nombre y la contraseña. Debe ser el nombre de usuario en el formato "dominio\nombreDeUsuario". El objeto DirectoryEntry , a continuación, intenta forzar al enlace de AdsObject mediante la obtención de la propiedad NativeObject . Si lo consigue, el atributo CN para el usuario se obtiene mediante la creación de un objeto DirectorySearcher y filtrando SAMAccountName. Después de que el usuario está autenticado, el método IsAuthenticated devuelve true.

Nota Cuando utiliza LDAP para enlazar a un objeto relacionado con Active Directory, Se están utilizando los puertos TCP. Aumento del uso de LDAP con el espacio de nombres System.DirectoryServices recurran a todos los puertos TCP que están disponibles. Es posible ser capaz de reducir la carga TCP mediante la reutilización de la conexión que utiliza para autenticar el usuario.
Grupos de usuarios
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 seguridad y grupos de distribución que el usuario pertenece a mediante la creación de un objeto DirectorySearcher y filtrando según el atributo memberOf . Este método devuelve una lista de grupos que se separa por 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 es ¿truncado, 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, no puede ser la cookie de autenticación creado. Si esta cadena potencialmente puede ser mayor que la longitud de la cookie, es aconsejable almacenar la información de grupo en el objeto Cache de ASP.NET o en una base de datos. Como alternativa, es aconsejable 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 autenticación cookie 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 canalización que es creado en la página Logon.aspx.

El código analiza la cadena en un 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, (ratón) en Global.asaxy, a continuación, haga clic en Ver código.
  2. Agregue el código siguiente en la parte superior del código, detrás del Archivo global.asax.vb:
    Imports System.Web.Security
    Imports System.Security.Principal
    					
  3. Reemplace el controlador de eventos vacío existente para el Application_AuthenticateRequest con el código siguiente:
    Sub Application_AuthenticateRequest(ByVal sender As Object, ByVal e As EventArgs)
            ' Fires upon attempting to authenticate the use
            Dim cookieName As String = FormsAuthentication.FormsCookieName
            Dim authCookie As HttpCookie = Context.Request.Cookies(cookieName)
    
            If (authCookie Is Nothing) Then
                'There is no authentication cookie.
                Return
            End If
    
            Dim authTicket As FormsAuthenticationTicket = Nothing
    
            Try
                authTicket = FormsAuthentication.Decrypt(authCookie.Value)
            Catch ex As Exception
                'Write the exception to the Event Log.
                Return
            End Try
    
            If (authTicket Is Nothing) Then
                'Cookie failed to decrypt.
                Return
            End If
    
            'When the ticket was created, the UserData property was assigned a
            'pipe-delimited string of group names.
            Dim groups As String() = authTicket.UserData.Split(New Char() {"|"})
    
            'Create an Identity.
            Dim id As GenericIdentity = New GenericIdentity(authTicket.Name, "LdapAuthentication")
    
            'This principal flows throughout the request.
            Dim principal As GenericPrincipal = New GenericPrincipal(id, groups)
    
            Context.User = principal
    
        End Sub
    					

Modificar el archivo Web.config

En esta sección, se configura el formularios, el autenticacióny el autorización 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 determinado usuarios y grupos de acceso 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="60" path="/" >
      </forms>
    </authentication>	
    <authorization>	
      <deny users="?" />
      <allow users="*" />
    </authorization>	
    <identity impersonate="true" />
  </system.web>
</configuration>
				
Aviso de la Identity impersonate = "true" /elemento de configuración. Esto hace que ASP.NET suplantar la cuenta que está configurado como la cuenta anónima de la información de Internet de Microsoft Services (IIS). Como resultado de esta configuración, todas las solicitudes a la siguiente aplicación se ejecuta 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 obtener información, consulte el REFERENCIASsección.

Configurar IIS para la autenticación anónima

Para configurar IIS para la autenticación anónima, siga estos pasos siguientes:
  1. En la gestión de servicios de Internet Information Server (IIS) la consola, haga clic en el nodo de directorio Virtual para "FormsAuthAd".
  2. Haga clic en las Propiedadesy, a continuación, haga clic en la ficha Seguridad de directorios .
  3. En control de autenticación y acceso anónimo, haga clic en Editar .
  4. Active la casilla de verificación Acceso anónimo .
  5. Hacer una cuenta de la cuenta anónima para la aplicación tiene permiso para Active Directory.
  6. Haga clic para desactivar la Permitir que IIS al Control Contraseña casilla de verificación.
El valor predeterminado IUSR_NombreDeEquipocuenta 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 denominado Logon.aspx:
  1. En el Explorador de soluciones, haga clic en el nodo del proyecto, seleccione para Agregary, a continuación, haga clic en Agregar formulario Web.
  2. Tipo Logon.aspx en el nombre de la caja y, a continuación, haga clic en Abrir.
  3. En el Explorador de soluciones, (ratón) 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="vb" AutoEventWireup="true" %>
    <%@ Import Namespace="FormsAuthAd.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">
    sub Login_Click(sender as object,e as EventArgs)
      Dim adPath as String = "LDAP://DC=..,DC=.." 'Path to your LDAP directory server
      Dim adAuth as LdapAuthentication = new LdapAuthentication(adPath)
      try
        if(true = adAuth.IsAuthenticated(txtDomain.Text, txtUsername.Text, txtPassword.Text)) then
          Dim groups as string = adAuth.GetGroups()
    
          'Create the ticket, and add the groups.
          Dim isCookiePersistent as boolean = chkPersist.Checked
          Dim authTicket as FormsAuthenticationTicket = new FormsAuthenticationTicket(1, _
               txtUsername.Text,DateTime.Now, DateTime.Now.AddMinutes(60), isCookiePersistent, groups)
    	
          'Encrypt the ticket.
          Dim encryptedTicket as String = FormsAuthentication.Encrypt(authTicket)
    		
          'Create a cookie, and then add the encrypted ticket to the cookie as data.
          Dim authCookie as HttpCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket)
    
          if(isCookiePersistent = true) then
    		authCookie.Expires = authTicket.Expiration
          end if				
          '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."
        end if
     
      catch ex as Exception
        errorLabel.Text = "Error authenticating. " & ex.Message
      end try
    end sub
    </script>
    					
  6. Modificar la ruta de acceso en la página Logon.aspx para que señale a su Servidor de directorio LDAP.
La página Logon.aspx es una página que recopila la información uno de los métodos de usuario y la llamada en la clase LdapAuthentication . Después de que el código autentica al usuario y obtiene una lista de los grupos, el código hace lo siguiente en este orden:
  • crea un objeto FormsAuthenticationTicket ;
  • cifra el vale;
  • Agrega el vale cifrado a una cookie;
  • Agrega la cookie a la colección HttpResponse.Cookies ;
  • redirige la solicitud a la dirección URL que se encontraba originalmente solicitado.

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 Logon.aspx página. Una vez autenticada la solicitud, la solicitud se redirige a la Página WebForm1.aspx.
  1. En el Explorador de soluciones, (ratón) 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="vb" 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">
    sub Page_Load(sender as object, e as EventArgs)
      lblName.Text = "Hello " + Context.User.Identity.Name & "."
      lblAuthType.Text = "You were authenticated using " &   Context.User.Identity.AuthenticationType & "."
    end sub
    </script>
    					
  4. Guarde todos los archivos y, a continuación, compile el proyecto.
  5. Solicite la página WebForm1.aspx. Tenga en cuenta que está redirige 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, tenga en cuenta que el usuario aparece el nombre y esa LdapAuthentication es el tipo de autenticación para la propiedad Context.User.Identity.AuthenticationType .
Nota Microsoft recomienda que utilice Secure Sockets Layer (SSL) el cifrado cuando se utiliza la autenticación de formularios. Esto es porque el usuario es identificado tomando como base la cookie de autenticación y cifrado de SSL en esto aplicación impide que alguien pueda poner en peligro la cookie de autenticación y cualquiera otra información valiosa que se transmiten.

Referencias

Para obtener más información, haga clic en el números de artículo siguientes para verlos en Microsoft Knowledge Base:
306590Información general sobre la seguridad ASP.NET
317012 Identidad de proceso y solicitud en ASP.NET
306238 Cómo implementar la seguridad basada en funciones con autenticación basada en formularios en la aplicación de ASP.NET mediante Visual Basic .NET
313091 Cómo crear claves utilizando Visual Basic .NET for use in Forms authentication
313116 Las solicitudes de autenticación de formularios no se dirigen a loginUrl página

Propiedades

Id. de artículo: 326340 - Última revisión: viernes, 29 de marzo de 2013 - Versión: 6.0
La información de este artículo se refiere a:
  • Microsoft ASP.NET 1.0
  • Microsoft Visual Basic .NET 2002 Standard Edition
  • Microsoft ASP.NET 1.1
  • Microsoft Visual Basic .NET 2003 Standard Edition
Palabras clave: 
kbconfig kbcookie kbhowtomaster kbsecurity kbwebforms kbmt KB326340 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): 326340

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