Al momento sei offline in attesa che la connessione Internet venga ristabilita

Modalità di autenticazione in Active Directory utilizzando l'autenticazione basata su form e Visual C# .NET

Il presente articolo è stato tradotto tramite il software di traduzione automatica di Microsoft e non da una persona. Microsoft offre sia articoli tradotti da persone fisiche sia articoli tradotti automaticamente da un software, in modo da rendere disponibili tutti gli articoli presenti nella nostra Knowledge Base nella lingua madre dell’utente. Tuttavia, un articolo tradotto in modo automatico non è sempre perfetto. Potrebbe contenere errori di sintassi, di grammatica o di utilizzo dei vocaboli, più o meno allo stesso modo di come una persona straniera potrebbe commettere degli errori parlando una lingua che non è la sua. Microsoft non è responsabile di alcuna imprecisione, errore o danno cagionato da qualsiasi traduzione non corretta dei contenuti o dell’utilizzo degli stessi fatto dai propri clienti. Microsoft, inoltre, aggiorna frequentemente il software di traduzione automatica.

316748
Questo articolo si riferisce ai seguenti spazi dei nomi delle librerie di classi di Microsoft .NET Framework:
  • System.Text
  • System.DirectoryServices
  • System.Security.Principal
  • System.Web.Security
Sommario
Questo articolo viene illustrata la modalità di ASP.NET è possibile utilizzare l'autenticazione basata su form per consentire agli utenti di autenticarsi in Active Directory mediante il protocollo LDAP (Lightweight Directory Access Protocol). Dopo l'utente è autenticato e reindirizzato, è possibile utilizzare il metodo Application_AuthenticateRequest del file Global.asax per memorizzare un oggetto GenericPrincipal nella proprietà HttpContext.User che passa la richiesta.

Creare un'applicazione Web ASP.NET in Visual C#. NET

Attenersi alla seguente procedura per creare una nuova applicazione Web ASP.NET denominata FormsAuthAd in Visual C#. NET:
  1. Avviare Microsoft Visual Studio .NET.
  2. Scegliere Nuovo dal menu file , quindi progetto .
  3. Fare clic su Progetti di Visual C# in Tipi progetto e quindi fare clic su Applicazione Web ASP.NET in modelli .
  4. Nella casella percorso , è necessario sostituire WebApplication1 con FormsAuthAd .
  5. Fare clic su OK .
  6. Fare clic con il pulsante destro del mouse sul nodo riferimenti in Esplora soluzioni e quindi fare clic su Aggiungi riferimento .
  7. Nella scheda .NET nella finestra di dialogo Aggiungi riferimento , fare clic su System.DirectoryServices.dll , fare clic su Seleziona e scegliere OK .

Scrivere il codice di autenticazione

Attenersi alla seguente procedura per creare un nuovo file di classe denominato LdapAuthentication.cs:
  1. In Esplora soluzioni, fare clic con il pulsante destro del mouse sul nodo progetto, scegliere Aggiungi , quindi Aggiungi nuovo elemento .
  2. Fare clic su classe in modelli .
  3. Digitare LdapAuthentication.cs nella casella Nome e quindi fare clic su Apri .
  4. Sostituire il codice esistente nel file LdapAuthentication.cs con il codice riportato di seguito.
    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();     }   }}					
Il codice di autenticazione accetta un dominio, un nome utente, una password e un percorso di struttura della console di Active Directory. Questo codice utilizza il provider di directory LDAP.

Il codice della pagina Logon.aspx chiama il metodo LdapAuthentication.IsAuthenticated e passa le credenziali vengono raccolti da parte dell'utente. Quindi, un oggetto DirectoryEntry viene creato con il percorso nella struttura della directory, il nome utente e la password. Il nome utente deve essere nel formato "dominio\nomeutente". L'oggetto DirectoryEntry tenta quindi di forzare l'associazione AdsObject ottenendo la proprietà NativeObject . Se questo ha esito positivo, l'attributo CN per l'utente viene ottenuto creazione di un oggetto DirectorySearcher e filtro di SAMAccountName . Dopo che l'utente è autenticato, il metodo di IsAuthenticated restituisce true .

Per ottenere un elenco dei gruppi che l'utente appartiene, questo codice chiama il metodo LdapAuthentication.GetGroups . Il metodo LdapAuthentication.GetGroups Ottiene un elenco dei gruppi di protezione e la distribuzione a cui appartiene l'utente per la creazione di un oggetto DirectorySearcher e filtrando in base all'attributo memberOf . Questo metodo restituisce un elenco di gruppi separati da pipe (|).

Si noti che il metodo LdapAuthentication.GetGroups modifica e tronca le stringhe. Questo riduce la lunghezza della stringa memorizzata nel cookie di autenticazione. Se la stringa non viene troncata, il formato di ogni gruppo viene visualizzato come indicato di seguito.
CN=...,...,DC=domain,DC=com				
Questo può creare una stringa molto lunga. Se la lunghezza di questa stringa è maggiore della lunghezza del cookie, browser potrebbero non accettare il cookie di autenticazione e si verrà reindirizzati alla pagina di accesso. Tuttavia, se si è in un ambiente multidominio, sarà necessario mantenere il nome di dominio con il nome di gruppo poiché gruppi in domini differenti possono avere lo stesso nome di gruppo. È necessario mantenere il nome di dominio per distinguere un gruppo da un altro.

La maggior parte dei browser supportano cookie fino a 4096 byte. Se questa stringa può potenzialmente la lunghezza del cookie, sarà necessario memorizzare le informazioni di gruppo nell'oggetto cache ASP.NET o in un database. In alternativa, è possibile che si desidera crittografare le informazioni di gruppo e memorizzare le informazioni in un campo modulo nascosto.

Scrivere il codice di Global.asax

Il codice nel file Global.asax fornisce un gestore di eventi Application_AuthenticateRequest . Questo gestore eventi recupera il cookie di autenticazione dall'insieme Context.Request.Cookies , decrittografa il cookie e recupera l'elenco dei gruppi che verranno memorizzati nella proprietà FormsAuthenticationTicket.UserData . I gruppi vengono visualizzati in un elenco, separati da pipe in creata nella pagina Logon.aspx.

Il codice analizza la stringa in una matrice di stringa per creare un oggetto GenericPrincipal . Dopo aver creato l'oggetto GenericPrincipal , questo oggetto viene posizionato nella proprietà HttpContext.User .
  1. In Esplora soluzioni, fare clic con il pulsante destro del mouse su Global.asax e quindi scegliere Visualizza codice .
  2. Aggiungere il codice riportato di seguito nella parte superiore del codice - dietro file Global.asax.cs:
    using System.Web.Security;using System.Security.Principal;					
  3. Sostituire il gestore eventi vuoto esistente per il Application_AuthenticateRequest con il codice riportato di seguito.
    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;	}					

Modificare il file Web.config

In questa sezione, è possibile configurare il <forms>, il <authentication> e il <authorization> gli elementi nel file Web.config. Con queste modifiche, solo agli utenti autenticati di accedere all'applicazione e le richieste non autenticate vengono reindirizzate a una pagina Logon.aspx. È possibile modificare questa configurazione per consentire solo certi utenti e gruppi di accesso all'applicazione.

Sostituire il codice esistente nel file Web.config con il codice riportato di seguito.
<?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>				
si noti il <identity impersonate="true" /> elemento di configurazione. In questo modo ASP.NET di rappresentare l'account configurato come l'account anonimo da Microsoft Internet Information Services (IIS). Come risultato di questa configurazione, tutte le richieste per l'applicazione viene eseguito nel contesto di protezione dell'account configurato. L'utente fornisce le credenziali per l'autenticazione in Active Directory, ma l'account che accede a Active Directory è l'account configurato. Per ulteriori informazioni, vedere i References di sezione.

Configurare IIS per l'autenticazione anonima

Per configurare IIS per l'autenticazione anonima, attenersi alla seguente procedura:
  1. In IIS, espandere il nodo del computer per il server, espandere siti Web , espandere sito Web predefinito , fare clic con il pulsante destro del mouse su FormsAuthAd e quindi scegliere Proprietà .
  2. Scegliere la Scheda Protezione Directory e quindi fare clic su Modifica nella casella controllo autenticazione e accesso anonimo .
  3. Verificare l'account anonimo per l'applicazione di un account che dispone dell'autorizzazione per Active Directory.
  4. Fare clic per deselezionare la casella Consenti per controllo password IIS.
  5. Nella sezione “ accesso con autenticazione ”, deselezionare la casella “ autenticazione Windows integrata ”.
  6. Fare clic su OK.
  7. Fare clic su Applica
Impostazione predefinita IUSR_ computername non dispone dell'autorizzazione in Active Directory.

Creare la pagina Logon.aspx

Attenersi alla seguente procedura per creare un nuovo ASP.NET Web Form denominato Logon.aspx:
  1. Fare clic con il pulsante destro del mouse sul nodo progetto in Esplora soluzioni, scegliere Aggiungi e quindi fare clic su Aggiungi Web Form .
  2. Digitare Logon.aspx nella casella Nome e quindi fare clic su Apri .
  3. In Esplora soluzioni, fare clic con il pulsante destro del mouse su Logon.aspx e quindi fare clic su Visualizza finestra di progettazione .
  4. Fare clic sulla scheda HTML nella finestra di progettazione.
  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. Modificare il percorso nella pagina Logon.aspx per riferimento al server LDAP.
La pagina Logon.aspx è una pagina che raccoglie le informazioni dai metodi utente e la chiamata della classe LdapAuthentication . Dopo il codice autentica l'utente e ottiene un elenco di gruppi, il codice crea un oggetto FormsAuthenticationTicket , consente di crittografare il ticket, aggiunge il ticket crittografato a un cookie, aggiunge il cookie all'insieme HttpResponse.Cookies e quindi reindirizza la richiesta all'URL richiesto originariamente.

Modificare la pagina WebForm1.aspx

La pagina WebForm1.aspx è la pagina richiesta originariamente. Quando l'utente richiede questa pagina, la richiesta viene reindirizzata la Logon.aspx pagina. Dopo la richiesta è autenticata, la richiesta viene reindirizzata alla pagina WebForm1.aspx.
  1. In Esplora soluzioni, fare clic con il pulsante destro del mouse su WebForm1.aspx e quindi fare clic su Visualizza finestra di progettazione .
  2. Fare clic sulla scheda HTML nella finestra di progettazione.
  3. Sostituire il codice esistente con il seguente 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. Salvare tutti i file e quindi compilare il progetto.
  5. Richiedere la pagina WebForm1.aspx. Si noti che si viene reindirizzati a Logon.aspx.
  6. Digitare le credenziali di accesso e quindi fare clic su Invia . Quando si viene reindirizzati a WebForm1.aspx, si noti che il nome utente visualizzato e che LdapAuthentication l'autenticazione si digitare per la proprietà Context.User.AuthenticationType .
Nota Si consiglia di utilizzare SSL (Secure Sockets Layer) quando si utilizza l'autenticazione basata su moduli di crittografia. Infatti, l'utente è identificato in base al cookie di autenticazione e crittografia SSL in questa applicazione impedisce a tutti gli utenti di compromettere il cookie di autenticazione e altre preziose informazioni trasmesse.
Riferimenti
Per ulteriori informazioni, fare clic sui numeri degli articoli della Microsoft Knowledge Base riportato di seguito:
306590Cenni preliminari sulla protezione ASP.NET
317012Identità di processo e della richiesta in ASP.NET
311495Come implementare protezione basata sui ruoli con l'autenticazione basata su form in un'applicazione ASP.NET utilizzando Visual C# .NET
313091Come creare chiavi tramite utilizzando Visual Basic .NET per l'utilizzo nell'autenticazione basata su form
313116Non richieste di autenticazione moduli sono possibile passare alla pagina loginUrl

Avviso: questo articolo è stato tradotto automaticamente

Proprietà

ID articolo: 316748 - Ultima revisione: 10/16/2007 17:59:02 - Revisione: 5.4

  • Microsoft Visual C# .NET 2003 Standard Edition
  • Microsoft Visual C# .NET 2002 Standard Edition
  • Microsoft ASP.NET 1.1
  • Microsoft ASP.NET 1.0
  • kbmt kbconfig kbcookie kbhowtomaster kbsecurity kbwebforms KB316748 KbMtit
Feedback