Este artículo se describe 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 Basic .NET
Siga estos pasos para crear una nueva aplicación Web ASP.NET denominada FormsAuthAd en Visual Basic. NET:
- Inicie Microsoft Visual Studio NET..
- En el menú archivo , seleccione nuevo y, a continuación, haga clic en proyecto .
- Haga clic en Proyectos de Visual Basic bajo Tipos de proyecto y, a continuación, haga clic en Aplicación Web ASP.NET bajo plantillas .
- En el cuadro ubicación , escriba http:// <servername>/FormsAuthAd (reemplazando http://localhost si está utilizando el servidor local (para tener http://localhost/FormsAuthAd y a continuación, haga clic en Aceptar .
- 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 .
- 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.vb:
- 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 .
- Haga clic en clase bajo plantillas .
- Escriba LdapAuthentication.vb en el cuadro nombre y, a continuación, haga clic en Abrir .
- Reemplace el código existente en el archivo LdapAuthentication.vb con el siguiente código:
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, una contraseña y una ruta para el árbol de Active Directory. Este código utiliza el proveedor de directorio LDAP.
Autenticación de usuarios
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 .
Nota Cuando se utiliza LDAP para enlazar a un objeto relacionados con Active Directory, se utilizan los puertos TCP. Mayor uso de LDAP con el espacio de nombres
System.DirectoryServices puede utilizar todos los puertos TCP disponibles. Puede reducir la carga TCP reutilizar la conexión que utiliza para autenticar el usuario.
Grupos de usuarios
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
se puede crear una cadena muy larga. Si la longitud de esta cadena es mayor que la longitud de la cookie, no se puede crear la cookie de autenticación. Si esta cadena potencialmente puede ser mayor que 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 .
- 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 .
- 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
- Reemplace el controlador de eventos vacío existente para el Application_AuthenticateRequest con el siguiente código:
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, configure los
forms, la
authentication y los elementos de
authorization 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="60" 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 de la sección.
Configurar IIS para autenticación anónima
Para configurar IIS para la autenticación anónima, siga estos pasos:
- Haga clic con el botón secundario en la consola de administración de servicios de Internet Information Server (IIS), en el directorio virtual nodo para "FormsAuthAd" .
- Haga clic en las Propiedades y, a continuación, haga clic en la ficha directorio .
- Haga clic en Editar bajo control de autenticación y acceso anónimo .
- Active la casilla de verificación Acceso anónimo .
- Asegúrese de la cuenta anónima para la aplicación de una cuenta que tenga permiso para Active Directory.
- Haga clic para desactivar la Permitir IIS para el control contraseña casilla de verificación.
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:
- 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 .
- Escriba Logon.aspx en el cuadro nombre y, a continuación, haga clic en Abrir .
- 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 .
- Haga clic en la ficha HTML en el diseñador.
- Replace the existing code with the following code:
<%@ 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>
- 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 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 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.
- 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 .
- Haga clic en la ficha HTML en el diseñador.
- 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>
- Guardar todos los archivos y, a continuación, compile el proyecto.
- Solicitar la página WebForm1.aspx. Observe que se le redirige a Logon.aspx.
- 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.Identity.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.
Para obtener más información, haga clic en los números de artículo siguientes para verlos en Microsoft Knowledge Base:
306590
(http://support.microsoft.com/kb/306590/
)
Introducción a la seguridad de ASP.NET
317012
(http://support.microsoft.com/kb/317012/
)
Identidad de proceso y solicitud en ASP.NET
306238
(http://support.microsoft.com/kb/306238/
)
Cómo implementar seguridad basada en funciones con autenticación basada en formularios en su aplicación ASP.NET mediante Visual Basic .NET
313091
(http://support.microsoft.com/kb/313091/
)
Cómo crear claves utilizando Visual Basic .NET para uso en autenticación mediante formularios
313116
(http://support.microsoft.com/kb/313116/
)
Las solicitudes de autenticación de formularios no se dirigen a loginUrl página