Você está offline; aguardando reconexão
Entrar

Não há suporte para seu navegador

Você precisa atualizar seu navegador para usar o site.

Atualize para a versão mais recente do Internet Explorer

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

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
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 SystemImports System.TextImports System.CollectionsImports System.DirectoryServicesNamespace 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 ClassEnd 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.SecurityImports 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 tryend 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

Aviso: este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 326340 - Última Revisão: 03/22/2007 11:28:33 - Revisão: 4.5

  • Microsoft ASP.NET 1.0
  • Microsoft Visual Basic .NET 2002 Standard Edition
  • Microsoft ASP.NET 1.1
  • Microsoft Visual Basic .NET 2003 Standard Edition
  • kbmt kbconfig kbcookie kbhowtomaster kbsecurity kbwebforms KB326340 KbMtpt
Comentários
ow.location.protocol) + "//c.microsoft.com/ms.js'><\/script>");