Este artigo passo a passo descreve como um ASP.NET aplicativo pode usar autenticação de formulários para permitir que os usuários para autenticar contra o Active Directory usando o protocolo (LDAP).
Depois que o usuário é autenticado e redirecionado, você pode usar o método
Application_AuthenticateRequest do arquivo global.asax para armazenar um objeto
GenericPrincipal na propriedade
HttpContext.User que flui em toda a solicitação.
Criar um aplicativo ASP.NET no Visual Basic .NET
Siga estas etapas para criar um novo aplicativo ASP.NET chamado FormsAuthAd no Visual Basic. NET:
- Inicie o Microsoft Visual Studio NET..
- No menu arquivo , aponte para novo e, em seguida, clique em Project .
- Clique em Projetos do Visual Basic em Tipos de projeto e, em seguida, clique em ASP.NET Web Application em modelos .
- Na caixa Location , digite <servername> http:// <nome_do_servidor>/FormsAuthAd (substituindo http://localhost se você estiver usando o servidor local (forma como tiver http://localhost/FormsAuthAd e, em seguida, clique em OK .
- Clique com o botão direito do mouse o nó References no Solution Explorer e clique em Add Reference .
- Na guia .NET na caixa de diálogo Add Reference , clique em System.DirectoryServices.dll , clique em Selecionar e, em seguida, clique em OK .
Escrever o código de autenticação
Siga estas etapas para criar um novo arquivo de classe chamado LdapAuthentication.vb:
- No Solution Explorer, clique com o botão direito no nó do projeto, aponte para Add e, em seguida, clique em Add New Item .
- Clique em classe em modelos .
- Digite LdapAuthentication.vb na caixa nome e em seguida, clique em Abrir .
- Substitua o código existente no arquivo LdapAuthentication.vb com o código a seguir:
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
Explicação sobre o código
O código de autenticação aceita um domínio, um nome de usuário, uma senha e um caminho para a árvore no Active Directory. Esse código usa o provedor de diretório LDAP.
Autenticação de usuário
O código na página logon.aspx chama o método
LdapAuthentication.IsAuthenticated e passa as credenciais que são coletadas do usuário. Em seguida, um objeto
DirectoryEntry é criado com o caminho para a árvore de diretório, o nome de usuário e a senha. O nome de usuário deve estar no formato "domínio\nome_do_usuário". O objeto
DirectoryEntry tenta forçar a ligação
AdsObject Obtendo a propriedade
NativeObject . Se isso tiver êxito, o atributo
CN do usuário é obtido criando um objeto
DirectorySearcher e filtrando em
SAMAccountName . Depois que o usuário é autenticado, o método
IsAuthenticated retorna
true .
Observação Ao usar o LDAP para vincular a um objeto relacionadas ao Active Directory, as portas TCP estão sendo usadas. Aumento do uso de LDAP com o espaço para nome
System.DirectoryServices pode usar todas as portas TCP que estão disponíveis. Você poderá reduzir a carga TCP reutilizando na conexão que você usou para autenticar o usuário.
Grupos de usuários
Para obter uma lista de grupos que o usuário pertence, este código chama o método
LdapAuthentication.GetGroups . O método
LdapAuthentication.GetGroups obtém uma lista de grupos de segurança e de distribuição que o usuário pertence a, criando um objeto
DirectorySearcher e pela filtragem de acordo com o atributo
memberOf . Esse método retorna uma lista de grupos que é separada por pipes (|).
Observe que o método
LdapAuthentication.GetGroups manipula e trunca seqüências de caracteres. Isso reduz o tamanho da seqüência de caracteres é armazenado no cookie de autenticação. Se a seqüência de caracteres não estiver truncada, o formato de cada grupo aparece da seguinte maneira:
CN=...,...,DC=domain,DC=com
isso pode criar uma seqüência de caracteres muito longa. Se o tamanho dessa seqüência de caracteres for maior que o comprimento do cookie, o cookie de autenticação não pode ser criado. Se essa seqüência de caracteres potencialmente pode ser maior que o comprimento do cookie, você pode querer armazenar as informações de grupo no objeto de cache do ASP.NET ou em um banco de dados. Como alternativa, convém criptografar as informações de grupo e armazenar essas informações em um campo de formulário oculto.
Escrever o código do global.asax
O código no arquivo global.asax fornece um manipulador de eventos
Application_AuthenticateRequest . Esse manipulador de eventos recupera o cookie de autenticação da coleção
Context.Request.Cookies , descriptografa o cookie e recupera a lista de grupos que serão armazenados na propriedade
FormsAuthenticationTicket.UserData . Os grupos aparecem em uma lista separada por pipe que é criada a página logon.aspx.
O código analisa a seqüência de caracteres em uma matriz de seqüência de caracteres para criar um objeto
GenericPrincipal . Depois que o objeto
GenericPrincipal é criado, esse objeto será colocado na propriedade
HttpContext.User .
- No Solution Explorer, clique com o botão direito do mouse em global.asax e, em seguida, clique em View Code .
- Adicione o seguinte código na parte superior do código por trás o arquivo global.asax.vb:
Imports System.Web.Security
Imports System.Security.Principal
- Substituir o manipulador de eventos vazia existente para Application_AuthenticateRequest com o código a seguir:
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 o arquivo Web.config
Nesta seção, você configurará os
forms, a
authentication e os elementos
authorization no arquivo Web.config. Com essas alterações, somente os usuários autenticados podem acessar o aplicativo e as solicitações não autenticadas são redirecionadas para uma página logon.aspx. Você pode modificar essa configuração para permitir que apenas determinados usuários e grupos de acesso ao aplicativo.
Substitua o código existente no arquivo Web.config com o código a seguir:
<?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 o
identity impersonate="true" / elemento de configuração. Isso faz com que ASP.NET para representar a conta que esteja configurada como a conta anônima da Microsoft (IIS). Como um resultado nessa configuração, todas as solicitações para este aplicativo executado no contexto de segurança da conta configurado. O usuário fornece credenciais para autenticar contra o Active Directory, mas a conta que acessa o Active Directory é a conta configurada. Para obter mais informações, consulte
REFERENCES seção.
Configurar o IIS para autenticação anônima
Para configurar o IIS para a autenticação anônima, execute estas etapas:
- No Internet Information Services (IIS) gerenciamento de console, clique com o botão direito no nó de diretório virtual para "FormsAuthAd" .
- Clique em Propriedades e, em seguida, clique na guia Segurança de diretório .
- Clique em Editar em Anonymous access and authentication control .
- Marque a caixa de seleção Acesso anônimo .
- Verifique a conta anônima para o aplicativo uma conta que tenha permissão para o Active Directory.
- Clique para limpar o Permitir IIS para controle senha caixa de seleção.
Conta padrão IUSR_
computername não tem permissão para o Active Directory.
Criar a página logon.aspx
Siga estas etapas para criar uma nova ASP.NET Web Form chamada logon.aspx:
- No Solution Explorer, clique com o botão direito no nó do projeto, aponte para Add e, em seguida, clique em Add Web Form .
- Digite logon.aspx na caixa nome e em seguida, clique em Abrir .
- No Solution Explorer, clique com o botão direito do mouse em logon.aspx e, em seguida, clique em View Designer .
- Clique na guia HTML no Designer.
- 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>
- Modifique o caminho na página logon.aspx para apontar para o servidor de diretório LDAP.
A página logon.aspx é uma página que coleta as informações dos usuário e chamada métodos na classe
LdapAuthentication . Depois que o código autentica o usuário e obtém uma lista de grupos, o código faz o seguinte nesta ordem:
- cria um objeto FormsAuthenticationTicket ;
- criptografa a permissão;
- Adiciona a permissão criptografada a um cookie;
- Adiciona o cookie à coleção HttpResponse.Cookies ;
- Redireciona a solicitação para a URL que foi originalmente solicitada.
Modificar a página WebForm1.aspx
A página WebForm1.aspx é a página é solicitada originalmente. Quando o usuário solicita esta página, a solicitação é redirecionada para logon.aspx a página. Depois que a solicitação é autenticada, a solicitação é redirecionada para a página WebForm1.aspx.
- No Solution Explorer, clique com o botão direito do mouse em WebForm1.aspx e, em seguida, clique em View Designer .
- Clique na guia HTML no Designer.
- Substitua o código existente com o código a seguir:
<%@ 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>
- Salve todos os arquivos e, em seguida, compilar o projeto.
- Solicite a página WebForm1.aspx. Observe que você é redirecionado para logon.aspx.
- Digite as credenciais de logon e em seguida, clique em Enviar . Quando você é redirecionado a WebForm1.aspx, observe que seu nome de usuário é exibido e LdapAuthentication é a autenticação tipo para a propriedade Context.User.Identity.AuthenticationType .
Observação A Microsoft recomenda que você use SSL (Secure Sockets LAYER) criptografia quando você usa autenticação de formulários. Isso ocorre porque o usuário é identificado com base no cookie de autenticação e criptografia SSL neste aplicativo impede que alguém comprometer o cookie de autenticação e quaisquer outras informações importantes que estão sendo transmitidas.
Para obter mais informações, clique nos números abaixo para ler os artigos na Base de dados de Conhecimento da Microsoft:
306590
(http://support.microsoft.com/kb/306590/
)
Visão geral sobre a segurança do ASP.NET
317012
(http://support.microsoft.com/kb/317012/
)
Processo e solicitação de identidade no ASP.NET
306238
(http://support.microsoft.com/kb/306238/
)
Como implementar a segurança baseada em função com autenticação com base em formulários em seu aplicativo ASP.NET usando Visual Basic .NET
313091
(http://support.microsoft.com/kb/313091/
)
Como criar chaves usando o Visual Basic .NET para uso em autenticação de formulários
313116
(http://support.microsoft.com/kb/313116/
)
Solicitações de autenticação de formulários não são direcionadas para loginUrl página