Como autenticar no Active Directory utilizando a autenticação por formulários e Visual Basic .NET

Traduções de Artigos Traduções de Artigos
Artigo: 326340 - Ver produtos para os quais este artigo se aplica.
Expandir tudo | Reduzir tudo

Nesta página

Sumário

Este artigo passo a passo descreve como um ASP.NET aplicação pode utilizar a autenticação de formulários para permitir aos utilizadores para autenticar no Active Directory utilizando o LIGHTWEIGHT Directory Access Protocol ().

Depois do utilizador é autenticado e redireccionado, pode utilizar o método Application_AuthenticateRequest do ficheiro global.asax para armazenar um objeto GenericPrincipal na propriedade HttpContext.User que flui durante o pedido.

Criar uma aplicação Web do ASP.NET no Visual Basic .NET

Siga estes passos para criar uma nova aplicação Web ASP.NET denominada FormsAuthAd no Visual Basic. NET:
  1. Inicie o Microsoft Visual Studio NET..
  2. No menu ficheiro , aponte para Novo e, em seguida, clique em projecto .
  3. Clique em Projectos do Visual Basic em Project Types e, em seguida, clique em ASP.NET Web Application em modelos .
  4. Na caixa localização , escreva http:// <servername>/FormsAuthAd (substituindo http://localhost se estiver a utilizar o servidor local (modo como para ter http://localhost/FormsAuthAd e, em seguida, clique em OK .
  5. Clique com o botão direito do rato no nó de referências no Solution Explorer e, em seguida, clique em Add Reference .
  6. No separador .NET na caixa de diálogo Adicionar referência do , clique em System.DirectoryServices.dll , clique em Seleccionar e, em seguida, clique em OK .

Escrever o código de autenticação

Siga estes passos para criar um novo ficheiro de classe chamado LdapAuthentication.vb:
  1. No Solution Explorer, clique com o botão direito do rato no nó de projecto, aponte para Adicionar e, em seguida, clique em Adicionar novo item .
  2. Clique em classe em modelos .
  3. Escreva LdapAuthentication.vb na caixa Nome e, em seguida, clique em Abrir .
  4. Substitua o código existente no ficheiro LdapAuthentication.vb com o seguinte 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
    
    
    					

EXPLICAÇÃO o código

O código de autenticação aceita um domínio, um nome de utilizador, uma palavra-passe e um caminho para a árvore no Active Directory. Este código utiliza o fornecedor de directório LDAP.
Autenticação de utilizador
O código na página logon.aspx chama o método LdapAuthentication.IsAuthenticated e passa nas credenciais que são recolhidas do utilizador. Em seguida, é criado um objecto DirectoryEntry com o caminho para a árvore de directórios, o nome de utilizador e a palavra-passe. O nome de utilizador deve estar no formato "domínio\utilizador". O objecto DirectoryEntry tenta forçar o enlace AdsObject obtendo a propriedade NativeObject . Se tiver êxito, o atributo CN para o utilizador é obtido por criar um objecto DirectorySearcher e por filtragem SAMAccountName . Depois do utilizador ser autenticado, o método IsAuthenticated devolve Verdadeiro .

Nota Quando utilizar LDAP para ligar a um objecto relacionadas com o Active Directory, as portas TCP são a ser utilizadas. Aumento de utilização do LDAP com o espaço de nomes System.DirectoryServices pode utilizar todas as portas TCP estão disponíveis. Poderá reduzir a carga TCP reutilizando na ligação que é utilizada para autenticar o utilizador.
Grupos de utilizador
Para obter uma lista de grupos que o utilizador pertence, este código chama o método de LdapAuthentication.GetGroups . O método LdapAuthentication.GetGroups obtém uma lista de grupos de segurança e de distribuição que o utilizador pertence por criar um objecto DirectorySearcher e por filtragem de acordo com o atributo memberOf . Este método devolve uma lista de grupos separados por encaminhamentos (pipes) (|).

Repare que o método LdapAuthentication.GetGroups manipula e trunca cadeias. Isto reduz o comprimento de cadeia que é armazenada no cookie de autenticação. Se a cadeia não estiver truncada, o formato de cada grupo é apresentado da seguinte forma:
CN=...,...,DC=domain,DC=com
				
Isto pode criar uma cadeia muito longa. Se o tamanho desta cadeia for superior ao comprimento do cookie, o cookie de autenticação poderá não ser criado. Se esta cadeia pode potencialmente ser superior ao comprimento do cookie, poderá armazenar as informações de grupo no objecto de cache do ASP.NET ou numa base de dados. Em alternativa, poderá encriptar as informações de grupo e armazenar estas informações num campo de formulário ocultos.

Escrever o código de global.asax

O código no ficheiro global.asax fornece um processador de eventos Application_AuthenticateRequest . Este processador de eventos obtém o cookie de autenticação da colecção Context.Request.Cookies , desencripta o cookie e obtém a lista de grupos que será armazenado na propriedade FormsAuthenticationTicket.UserData . Os grupos aparecem numa lista separada por pipe que é criada na página logon.aspx.

O código analisa a cadeia de uma matriz de cadeia para criar um objecto GenericPrincipal . Depois do objecto GenericPrincipal é criado, este objecto será colocado na propriedade HttpContext.User .
  1. No Solution Explorer, clique com o botão direito do rato em global.asax e, em seguida, clique em Código .
  2. Adicione o seguinte código na parte superior do código do segundo ficheiro Global.asax.vb:
    Imports System.Web.Security
    Imports System.Security.Principal
    					
  3. Substituir o processador de eventos vazia existente para Application_AuthenticateRequest o seguinte 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 o ficheiro Web.config

Nesta secção, configurar de forms, a authentication e os elementos de authorization o ficheiro Web.config. Com estas alterações, apenas utilizadores autenticados podem aceder à aplicação e os pedidos não autenticados são redireccionados para uma página logon.aspx. É possível modificar esta configuração para permitir que apenas determinados utilizadores e grupos de acesso à aplicação.

Substitua o código existente no ficheiro Web.config com o seguinte código:
<?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 o identity impersonate="true" / elemento de configuração. Isto faz com que o ASP.NET representar a conta que é configurada como a conta anónima da Microsoft (IIS). Como resultado nesta configuração, todos os pedidos para esta aplicação executado no contexto de segurança da conta configurada. O utilizador fornece credenciais para autenticação no Active Directory, mas a conta que aceda ao Active Directory é a conta configurada. Para mais informações, consulte as REFERENCES de secção.

Configurar o IIS para autenticação anónima

Para configurar o IIS para a autenticação anónima, siga estes passos:
  1. Clique com o botão direito na consola de gestão dos serviços de informação Internet (IIS), rato no directório virtual nó para "FormsAuthAd" .
  2. Clique na Propriedades e, em seguida, clique no separador Segurança de directórios .
  3. Clique em Editar em controlo de acesso anónimo e autenticação .
  4. Seleccione a caixa de verificação Acesso anónimo .
  5. Certifique a conta anónima para a aplicação de uma conta que tenha permissão para o Active Directory.
  6. Clique para desmarcar a Permitir que o IIS para controlo de palavra-passe caixa de verificação.
A conta predefinida IUSR_ computername não tem permissão para o Active Directory.

Criar a página logon.aspx

Siga estes passos para criar um novo formulário da Web ASP.NET denominado logon.aspx:
  1. No Solution Explorer, clique com o botão direito do rato no nó de projecto, aponte para Adicionar e, em seguida, clique em Adicionar formulário de Web .
  2. Escreva logon.aspx na caixa Nome e, em seguida, clique em Abrir .
  3. No Solution Explorer, clique com o botão direito do rato logon.aspx e, em seguida, clique em Estruturador de vistas .
  4. Clique no separador 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 directórios de LDAP.
A página logon.aspx é uma página que recolhe as informações dos métodos de chamada e de utilizador na classe LdapAuthentication . Depois do código autentica o utilizador e obtém uma lista de grupos, o código efectua o seguinte na seguinte ordem:
  • cria um objecto FormsAuthenticationTicket ;
  • encripta o "ticket";
  • Adiciona um cookie; permissão encriptada
  • Adiciona o cookie ao conjunto HttpResponse.Cookies ;
  • redirecciona o pedido para o URL que foi originalmente pedido.

Modificar a página WebForm1.aspx

Página WebForm1.aspx é a página é pedida originalmente. Quando o utilizador pede nesta página, o pedido é redireccionado para o logon.aspx página. Depois do pedido estiver autenticado, o pedido é redireccionado para a página WebForm1.aspx.
  1. No Solution Explorer, clique com o botão direito do rato em WebForm1.aspx e, em seguida, clique em View Designer .
  2. Clique no separador HTML no Designer.
  3. Substitua o código existente com o seguinte código:
    <%@ 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 os ficheiros e, em seguida, compilar o projecto.
  5. Pedir a página WebForm1.aspx. Repare que são redireccionados para logon.aspx.
  6. Escreva as credenciais de início de sessão e, em seguida, clique em Submeter . Quando são redireccionados para WebForm1.aspx, repare que aparece o nome de utilizador e LdapAuthentication consiste na autenticação tipo para a propriedade Context.User.Identity.AuthenticationType .
Nota A Microsoft recomenda que utilize (Secure Sockets Layer) encriptação quando utilizar a autenticação de formulários. Isto acontece porque o utilizador é identificado baseia o cookie de autenticação e encriptação SSL esta aplicação impede que qualquer pessoa comprometer o cookie de autenticação e quaisquer outras informações importantes que está a ser transmitidas.

Referências

Para obter mais informações, clique números de artigo que se seguem para visualizar os artigos na base de dados de conhecimento da Microsoft:
306590Descrição geral da segurança do ASP.NET
317012Identidade de processo e um pedido no ASP.NET
306238Como implementar segurança baseada em funções com a autenticação baseada em formulários na aplicação do ASP.NET utilizando o Visual Basic .NET
313091A criação de chaves utilizando o Visual Basic .NET para utilização na autenticação de formulários
313116Pedidos de autenticação de formulários não são direccionados para loginUrl página

Propriedades

Artigo: 326340 - Última revisão: 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 revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes 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