Como autenticar contra o Active Directory utilizando a autenticação de formulários e o Visual c# .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 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: 316748
Este artigo refere-se os espaços de nomes de biblioteca de classes do Microsoft .NET Framework seguintes:
  • System.Text
  • System. DirectoryServices
  • System.Security.Principal
  • System.Web.Security
Sumário
Este artigo passo a passo demonstra como uma aplicação do ASP.NET pode utilizar a autenticação de formulários para permitir aos utilizadores para efectuar a autenticação do Active Directory utilizando o LDAP Lightweight Directory Access Protocol (). Depois do utilizador é autenticado e redireccionado, pode utilizar o método de Application_AuthenticateRequest do ficheiro global asax para armazenar um objecto de GenericPrincipal na propriedade HttpContext.User que flui ao longo do pedido.

Criar uma aplicação ASP.NET Web no Visual c# .NET

Siga estes passos para criar uma nova aplicação Web do ASP.NET com o nome FormsAuthAd no Visual c# .NET:
  1. Inicie o Microsoft Visual Studio .NET.
  2. No menu ficheiro , aponte para Novoe, em seguida, clique em projecto.
  3. Clique em Visual c# Projects em Tipos de projectoe, em seguida, clique em ASP.NET Web Application em modelos.
  4. Na caixa localização , substitua WebApplication1 com FormsAuthAd.
  5. Clique em OK.
  6. Botão direito do rato no nó de referências no Solution Explorer e, em seguida, clique em Adicionar referência.
  7. No separador na caixa de diálogo Adicionar referência do.NET , clique em System.DirectoryServices.dll, clique em Seleccionare, em seguida, clique em OK.

Escrever o código de autenticação

Siga estes passos para criar um novo ficheiro de classe, chamado LdapAuthentication.cs:
  1. No Solution Explorer, faça duplo clique no nó de projecto, pointto, Adicionare, em seguida, clique em Adicionar Novo Item.
  2. Clique em classe em modelos.
  3. Tipo LdapAuthentication.cs o nome de caixa e, em seguida, clique em Abrir.
  4. Substitua o código existente no filewith a LdapAuthentication.cs o seguinte código.
    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 utilizador, uma palavra-passe e um caminho para a árvore no Active Directory. Este código utiliza o fornecedor de directório LDAP.

O código na página aspx chama o método de LdapAuthentication.IsAuthenticated e transmite as credenciais que são recolhidas do utilizador. Em seguida, é criado um objecto de DirectoryEntry com o caminho para a árvore de directórios, o nome de utilizador e a palavra-passe. O nome de utilizador tem de ser no formato "domínio \ nome_utilizador". O objecto de DirectoryEntry , em seguida, tenta forçar o enlace de AdsObject , obtendo a propriedade NativeObject . Se este procedimento tiver êxito, o atributo de NC para o utilizador é obtido através da criação de um objecto de DirectorySearcher iniciou e filtrando o SAMAccountName. Depois do utilizador é autenticado, o método IsAuthenticated devolve Verdadeiro.

Para obter uma lista de grupos a que pertence o utilizador, 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, criando um objecto de DirectorySearcher iniciou e filtrando em conformidade com o atributo memberOf . Este método devolve uma lista de grupos que está separada por condutas (|).

Repare que o método de LdapAuthentication.GetGroups manipula e trunca cadeias. Isto reduz o comprimento da cadeia que é armazenada no cookie da autenticação. Se a cadeia não estiver truncada, o formato de cada grupo aparece da seguinte forma.
CN=...,...,DC=domain,DC=com				
Isto pode criar uma cadeia muito longa. Se o comprimento desta cadeia for superior ao comprimento do cookie, browsers podem não aceitar o cookie de autenticação e será redireccionado para a página de início de sessão. No entanto, se estiver num ambiente com vários domínio, poderá ter de manter o nome de domínio com o nome do grupo, uma vez que os grupos em domínios diferentes podem ter o mesmo nome de grupo. Tem de manter o nome de domínio para diferenciar um grupo de outro.

A maioria dos browsers suportam cookies de até 4096 bytes. Se esta cadeia pode potencialmente exceder o comprimento do cookie, poderá armazenar as informações de grupo, o objecto de Cache do ASP.NET ou numa base de dados. Em alternativa, poderá pretender encriptar as informações de grupo e armazenar estas informações num campo de formulário oculto.

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 de 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 aspx.

O código analisa a cadeia de uma matriz de cadeia para criar um objecto GenericPrincipal . Depois de criar o objecto de GenericPrincipal , este objecto é colocado na propriedade HttpContext.User .
  1. No Solution Explorer, com o botão direito global. asaxe, em seguida, clique em Ver código.
  2. Adicione o seguinte código na parte superior do ficheiro behindGlobal.asax.cs do código:
    using System.Web.Security;using System.Security.Principal;					
  3. Substitua o processador de eventos vazios existente para o Application_AuthenticateRequest com o seguinte código.
    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 ficheiro Web. config.

Nesta secção, irá configurar a <forms> </forms>, o <authentication> </authentication>e o <authorization></authorization> elementos no ficheiro Web. config. Com estas alterações, apenas utilizadores autenticados podem aceder à aplicação e pedidos não autenticados são redireccionados para uma página aspx. Pode modificar esta configuração para permitir que apenas determinados utilizadores e grupos o 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="10" path="/" >      </forms>    </authentication>	    <authorization>	      <deny users="?" />      <allow users="*" />    </authorization>	    <identity impersonate="true" />  </system.web></configuration>				
Aviso de <identity impersonate="true"></identity> elemento de configuração. Isto faz com que o ASP.NET para representar a conta que esteja configurada como a conta anónima do Microsoft Internet Information Services (IIS). Como resultado desta configuração, todos os pedidos para esta aplicação é executada no contexto de segurança da conta configurada. O utilizador fornece credenciais para autenticar o Active Directory, mas a conta que aceda ao Active Directory é a conta configurada. Para mais informações, consulte o Referências secção.

Configurar o IIS para autenticação anónima

Para configurar o IIS para a autenticação anónima, siga estes passos:
  1. No IIS, expanda o nó de computador para o servidor, expanda Web Sites, expanda o Web Site predefinido, FormsAuthAdcom o botão direito e, em seguida, clique em Propriedades.
  2. Clique no Separador de segurança de directórioe, em seguida, clique em Editar em Anonymous Access and Authentication Control.
  3. Tornar uma conta anónima para a aplicação de uma conta que tenha permissão para o Active Directory.
  4. Clique para desmarcar a caixa de verificação Permitir que o IIS controle a senha.
  5. Na secção "Acesso autenticado", desmarque a caixa de verificação "Autenticação integrada do Windows".
  6. Clique em OK.
  7. Clique em aplicar
A predefinição IUSR _nome do computador conta não tem permissão para o Active Directory.

Criar a página aspx

Siga estes passos para criar um novo formulário de Web do ASP.NET com o nome aspx:
  1. No Solution Explorer, com o botão direito no nó de projecto, pointto, Adicionare, em seguida, clique em Adicionar formulário de Web.
  2. Tipo Aspx o nome de caixa e, em seguida, clique em Abrir.
  3. No Solution Explorer, com o botão direito aspxe, em seguida, clique em Estruturador de vistas.
  4. Clique no separador HTML no Designer.
  5. Substitua o código existente com o seguinte código.
    <%@ 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 aspx para apontar para o servidor de directório de yourLDAP.
A página aspx é uma página que recolhe os métodos de utilizador e a chamada a informação na classe LdapAuthentication . Depois do código autentica o utilizador e obtém uma lista de grupos, o código cria um objecto de FormsAuthenticationTicket , encripta a permissão, adiciona a permissão encriptada a um cookie, adiciona o cookie para a colecção de HttpResponse.Cookies e, em seguida, redirecciona o pedido para o URL que foi originalmente pedido.

Modificar a página WebForm1. aspx

A página WebForm1. aspx é a página que é pedida originalmente. Quando o utilizador pede esta página, o pedido é redireccionado para a página aspx. Depois do pedido é autenticado, o pedido é redireccionado para a página WebForm1. aspx.
  1. No Solution Explorer, com o botão direito WebForm1. aspxe, em seguida, clique em Estruturador de vistas.
  2. Clique no separador HTML no Designer.
  3. Substitua o código existente com o seguinte código.
    <%@ 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. Guarde todos os ficheiros e, em seguida, compilar o projecto.
  5. Pedir a página de WebForm1. aspx. Repare que areredirected para aspx.
  6. Escreva as credenciais de início de sessão e, em seguida, clique em Submeter. Quando é redireccionado para WebForm1. aspx, repare que o seu nome de utilizador é apresentada e que LdapAuthentication é a autenticação escreva para a propriedade Context.User.AuthenticationType .
Nota A Microsoft recomenda que utilize encriptação Secure Sockets Layer (SSL) quando utiliza a autenticação de formulários. Isto acontece porque o utilizador é identificado com base no cookie de autenticação e encriptação de SSL nesta aplicação impede que alguém comprometer o cookie de autenticação e quaisquer outras informações importantes que seja transmitidas.
Referências
Para mais informações, clique nos números de artigo seguinte para visualizar os artigos na Microsoft Knowledge Base:
306590 Descrição geral de segurança do ASP.NET
317012 Identidade de processo e a pedido no ASP.NET
311495 Como implementar segurança baseada em funções com a autenticação baseada em formulários de aplicação do ASP.NET utilizando o Visual c# .NET
313091 A criação de chaves utilizando o Visual Basic .NET para utilização na autenticação de formulários
313116 Pedidos de autenticação de formulários não são dirigidos para a página loginUrl

Aviso: Este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 316748 - Última Revisão: 01/03/2015 16:20:00 - Revisão: 6.0

Microsoft Visual C# .NET 2003 Standard Edition, Microsoft Visual C# .NET 2002 Standard Edition, Microsoft ASP.NET 1.1, Microsoft ASP.NET 1.0

  • kbconfig kbcookie kbhowtomaster kbsecurity kbwebforms kbmt KB316748 KbMtpt
Comentários