Como autenticar contra o Active Directory usando a autenticação de formulários e Visual translation from VPE for Csharp .NET

Traduções deste artigo Traduções deste artigo
ID do artigo: 316748 - Exibir os produtos aos quais esse artigo se aplica.
Este artigo se refere à seguintes Microsoft .NET Framework Class Library namespaces:
  • System.Text
  • System.DirectoryServices
  • System.Security.principal
  • System.Web.Security
Expandir tudo | Recolher tudo

Neste artigo

Sumário

Este artigo passo a passo demonstra 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 translation from VPE for Csharp NET

Siga estas etapas para criar um novo aplicativo ASP.NET chamado FormsAuthAd no Visual translation from VPE for Csharp. 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 translation from VPE for Csharp em Tipos de projeto e, em seguida, clique em ASP.NET Web Application em modelos .
  4. Na caixa Location , substitua WebApplication1 FormsAuthAd .
  5. Clique em OK .
  6. Clique com o botão direito do mouse o nó References no Solution Explorer e clique em Add Reference .
  7. 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.cs:
  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.cs na caixa nome e em seguida, clique em Abrir .
  4. Substitua o código existente no arquivo LdapAuthentication.cs com o código a seguir.
    using System;
    using System.Text;
    using System.Collections;
    using System.DirectoryServices;
    
    namespace FormsAuth
    {	
      public class LdapAuthentication
      {
        private String _path;
        private String _filterAttribute;
    
        public LdapAuthentication(String path)
        {
          _path = path;
        }
    		
        public bool IsAuthenticated(String domain, String username, String pwd)
        {
          String domainAndUsername = domain + @"\" + username;
          DirectoryEntry entry = new DirectoryEntry(_path, domainAndUsername, pwd);
    			
          try
          {	//Bind to the native AdsObject to force authentication.			
             Object obj = entry.NativeObject;
    
    	DirectorySearcher search = new DirectorySearcher(entry);
    
    	search.Filter = "(SAMAccountName=" + username + ")";
    	search.PropertiesToLoad.Add("cn");
    	SearchResult result = search.FindOne();
    
    	if(null == result)
    	{
      	  return false;
    	}
    
    	//Update the new path to the user in the directory.
    	_path = result.Path;
    	_filterAttribute = (String)result.Properties["cn"][0];
          }
          catch (Exception ex)
          {
            throw new Exception("Error authenticating user. " + ex.Message);
          }
    
    	return true;
         }
    
         public String GetGroups()
         {
           DirectorySearcher search = new DirectorySearcher(_path);
           search.Filter = "(cn=" + _filterAttribute + ")";
           search.PropertiesToLoad.Add("memberOf");
           StringBuilder groupNames = new StringBuilder();
    
           try
           {
             SearchResult result = search.FindOne();
    
    	 int propertyCount = result.Properties["memberOf"].Count;
    
       	 String dn;
    	 int equalsIndex, commaIndex;
    				
    	 for(int propertyCounter = 0; propertyCounter < propertyCount; propertyCounter++)
    	 {
    	   dn = (String)result.Properties["memberOf"][propertyCounter];
    
        	   equalsIndex = dn.IndexOf("=", 1);
    	   commaIndex = dn.IndexOf(",", 1);
    	   if(-1 == equalsIndex)
    	   {
    	     return null;
         	   }
    
               groupNames.Append(dn.Substring((equalsIndex + 1), (commaIndex - equalsIndex) - 1));
    	   groupNames.Append("|");
    
        	 }
           }
           catch(Exception ex)
           {
             throw new Exception("Error obtaining group names. " + ex.Message);
           }			
           return groupNames.ToString();
         }
       }
    }
    					
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.

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 .

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 comprimento dessa seqüência de caracteres for maior que o comprimento do cookie, navegadores não podem aceitar o cookie de autenticação e você será redirecionado para a página de logon. No entanto, se você estiver em um ambiente de vários domínios, talvez você precise manter o nome de domínio com o nome do grupo como os grupos em domínios diferentes podem ter o mesmo nome de grupo. Você precisará manter o nome de domínio para diferenciar um grupo de outro.

A maioria dos navegadores oferecem suporte cookies de até 4096 bytes. Se essa seqüência de caracteres potencialmente pode exceder 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 - behind arquivo global.asax.cs:
    using System.Web.Security;
    using System.Security.Principal;
    					
  3. Substituir o manipulador de eventos vazia existente para Application_AuthenticateRequest com o código a seguir.
    void Application_AuthenticateRequest(Object sender, EventArgs e)
    {
      String cookieName = FormsAuthentication.FormsCookieName;
      HttpCookie authCookie = Context.Request.Cookies[cookieName];
    
      if(null == authCookie)
      {//There is no authentication cookie.
        return;
      }	
    		
      FormsAuthenticationTicket authTicket = null;
    	
      try
      {
        authTicket = FormsAuthentication.Decrypt(authCookie.Value);
      }
      catch(Exception ex)
      {
        //Write the exception to the Event Log.
        return;
      }
    	
      if(null == authTicket)
      {//Cookie failed to decrypt.
        return;		
      }		
    	
      //When the ticket was created, the UserData property was assigned a
      //pipe-delimited string of group names.
      String[] groups = authTicket.UserData.Split(new char[]{'|'});
    
      //Create an Identity.
      GenericIdentity id = new GenericIdentity(authTicket.Name, "LdapAuthentication");
    	
      //This principal flows throughout the request.
      GenericPrincipal principal = new GenericPrincipal(id, groups);
    
      Context.User = principal;
    	
    }
    					

Modificar o arquivo Web.config

Nesta seção, você irá configurar o <forms>, o <authentication> e o <authorization> elementos 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="10" 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 a seção.

Configurar o IIS para a autenticação anônima

Para configurar o IIS para a autenticação anônima, execute estas etapas:
  1. No IIS, expanda o nó do computador para o servidor, expanda Sites , expanda Site padrão , clique com o botão direito do mouse FormsAuthAd e, em seguida, clique em Propriedades .
  2. Clique na Guia de segurança de diretório e, em seguida, clique em Editar em Anonymous Access and Authentication Control .
  3. Verifique a conta anônima para o aplicativo uma conta que tenha permissão para o Active Directory.
  4. Clique para desmarcar a caixa de seleção Permitir IIS para senha de controle.
  5. Na seção ? acesso autenticados ?, desmarque a caixa de seleção ? autenticação integrada do Windows ?.
  6. Clique em OK.
  7. Clique em Aplicar
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="c#" AutoEventWireup="true" %>
    <%@ Import Namespace="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>
    void Login_Click(Object sender, EventArgs e)
    {
      String adPath = "LDAP://corp.com"; //Fully-qualified Domain Name
      LdapAuthentication adAuth = new LdapAuthentication(adPath);
      try
      {
        if(true == adAuth.IsAuthenticated(txtDomain.Text, txtUsername.Text, txtPassword.Text))
        {
          String groups = adAuth.GetGroups();
    
          //Create the ticket, and add the groups.
          bool isCookiePersistent = chkPersist.Checked;
          FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(1,  txtUsername.Text,
    	DateTime.Now, DateTime.Now.AddMinutes(60), isCookiePersistent, groups);
    	
          //Encrypt the ticket.
          String encryptedTicket = FormsAuthentication.Encrypt(authTicket);
    		
          //Create a cookie, and then add the encrypted ticket to the cookie as data.
          HttpCookie authCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);
    
          if(true == isCookiePersistent)
    	authCookie.Expires = authTicket.Expiration;
    				
          //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.";
        }
      }
      catch(Exception ex)
      {
        errorLabel.Text = "Error authenticating. " + ex.Message;
      }
    }
    </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 cria um objeto FormsAuthenticationTicket , criptografa a permissão, adiciona a permissão criptografada a um cookie, adiciona o cookie à coleção HttpResponse.Cookies e 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 idioma da página code.
    <%@ Page language="c#" 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>
    void Page_Load(Object sender, EventArgs e)
    {
      lblName.Text = "Hello " + Context.User.Identity.Name + ".";
      lblAuthType.Text = "You were authenticated using " +   Context.User.Identity.AuthenticationType + ".";
    }
    </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.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
311495Como implementar a segurança baseada em função com autenticação com base em formulários em seu aplicativo ASP.NET usando o Visual translation from VPE for Csharp .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 a página loginUrl

Propriedades

ID do artigo: 316748 - Última revisão: terça-feira, 16 de outubro de 2007 - Revisão: 5.4
A informação contida neste artigo aplica-se a:
  • Microsoft Visual C# .NET 2003 Standard Edition
  • Microsoft Visual C# .NET 2002 Standard Edition
  • Microsoft ASP.NET 1.1
  • Microsoft ASP.NET 1.0
Palavras-chave: 
kbmt kbconfig kbcookie kbhowtomaster kbsecurity kbwebforms KB316748 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: 316748

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