Como autenticar contra o Active Directory usando a autenticação de formulários e Visual Basic .NET

Traduções deste artigo Traduções deste artigo
ID do artigo: 326340 - Exibir os produtos aos quais esse artigo se aplica.
Expandir tudo | Recolher tudo

Neste artigo

Sumário

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:
  1. Inicie o Microsoft Visual Studio NET..
  2. No menu arquivo , aponte para novo e, em seguida, clique em Project .
  3. Clique em Projetos do Visual Basic em Tipos de projeto e, em seguida, clique em ASP.NET Web Application em modelos .
  4. 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 .
  5. Clique com o botão direito do mouse o nó References no Solution Explorer e clique em Add Reference .
  6. 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:
  1. No Solution Explorer, clique com o botão direito no nó do projeto, aponte para Add e, em seguida, clique em Add New Item .
  2. Clique em classe em modelos .
  3. Digite LdapAuthentication.vb na caixa nome e em seguida, clique em Abrir .
  4. 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 .
  1. No Solution Explorer, clique com o botão direito do mouse em global.asax e, em seguida, clique em View Code .
  2. 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
    					
  3. 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:
  1. No Internet Information Services (IIS) gerenciamento de console, clique com o botão direito no nó de diretório virtual para "FormsAuthAd" .
  2. Clique em Propriedades e, em seguida, clique na guia Segurança de diretório .
  3. Clique em Editar em Anonymous access and authentication control .
  4. Marque a caixa de seleção Acesso anônimo .
  5. Verifique a conta anônima para o aplicativo uma conta que tenha permissão para o Active Directory.
  6. 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:
  1. No Solution Explorer, clique com o botão direito no nó do projeto, aponte para Add e, em seguida, clique em Add Web Form .
  2. Digite logon.aspx na caixa nome e em seguida, clique em Abrir .
  3. No Solution Explorer, clique com o botão direito do mouse em logon.aspx e, em seguida, clique em View Designer .
  4. Clique na guia HTML no Designer.
  5. 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>
    					
  6. 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.
  1. No Solution Explorer, clique com o botão direito do mouse em WebForm1.aspx e, em seguida, clique em View Designer .
  2. Clique na guia HTML no Designer.
  3. 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>
    					
  4. Salve todos os arquivos e, em seguida, compilar o projeto.
  5. Solicite a página WebForm1.aspx. Observe que você é redirecionado para logon.aspx.
  6. 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.

Referências

Para obter mais informações, clique nos números abaixo para ler os artigos na Base de dados de Conhecimento da Microsoft:
306590Visão geral sobre a segurança do ASP.NET
317012Processo e solicitação de identidade no ASP.NET
306238Como 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
313091Como criar chaves usando o Visual Basic .NET para uso em autenticação de formulários
313116Solicitações de autenticação de formulários não são direcionadas para loginUrl página

Propriedades

ID do artigo: 326340 - Última revisão: quinta-feira, 22 de março de 2007 - Revisão: 4.5
A informação contida neste artigo aplica-se 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
Palavras-chave: 
kbmt kbconfig kbcookie kbhowtomaster kbsecurity kbwebforms KB326340 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 326340

Submeter comentários

 

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