Wie für die Active Directory die Authentifizierung mithilfe von Formularauthentifizierung und Visual C# .NET

SPRACHE AUSWÄHLEN SPRACHE AUSWÄHLEN
Artikel-ID: 316748 - Produkte anzeigen, auf die sich dieser Artikel bezieht
Dieser Artikel bezieht sich auf der folgenden Microsoft .NET Namespaces für Framework-Klassenbibliothek:
  • System.Text
  • System.DirectoryServices
  • System.Security.Principal
  • System.Web.Security
Alles erweitern | Alles schließen

Auf dieser Seite

Zusammenfassung

Dieser schrittweise aufgebaute Artikel beschreibt, wie eine ASP.NET Anwendung kann die Formularauthentifizierung so berechtigen Sie Benutzer zur Authentifizierung verwenden in Active Directory mithilfe von Lightweight Directory Access Protocol (LDAP). Nachdem der Benutzer authentifiziert und weitergeleitet wird, können Sie die Application_AuthenticateRequest -Methode der Datei Global.asax ein GenericPrincipal -Objekt in der Eigenschaft HttpContext.User speichern, die während der gesamten Anforderung fließt.

Erstellen Sie eine ASP.NET Webanwendung in Visual C# .NET

Gehen Sie folgendermaßen vor, um eine neue ASP.NET Web-Anwendung mit dem Namen zu erstellen FormsAuthAd in Visual C# .NET:
  1. Starten Sie Microsoft Visual Studio .NET.
  2. Klicken Sie im Menü Datei auf neuzeigen Sie und klicken Sie dann auf Projekt.
  3. Klicken Sie unter Projekttypenauf Visual C#-Projekte , und klicken Sie anschließend unter Vorlagenauf ASP.NET Web Application .
  4. Ersetzen Sie im Feld Speicherort WebApplication1 mit FormsAuthAd.
  5. Klicken Sie auf OK.
  6. Im Projektmappen-Explorer mit der rechten Maustaste auf Verweise , und klicken Sie dann auf Verweis hinzufügen.
  7. Klicken Sie auf der Registerkarte .NET im Dialogfeld Verweis hinzufügen klicken Sie auf System.DirectoryServices.dllklicken Sie auf auswählen, und klicken Sie dann auf OK.

Den Authentifizierungscode schreiben

Gehen Sie folgendermaßen vor, um eine neue Klassendatei mit dem Namen zu erstellen LdapAuthentication.cs:
  1. Im Projektmappen-Explorer mit der rechten Maustaste des Projektknoten, zeigen Sie auf Hinzufügenund klicken Sie dann auf Neues Element hinzufügen.
  2. Klicken Sie unter Vorlagenauf Klasse .
  3. Typ LdapAuthentication.cs in den Namen ein, und klicken Sie dann auf Öffnen.
  4. Ersetzen Sie den vorhandenen Code in der Datei LdapAuthentication.cs mit den folgenden Code.
    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();
         }
       }
    }
    					
Der Authentifizierungscode akzeptiert eine Domäne, einen Benutzernamen ein Kennwort und einen Pfad zu der Struktur im Active Directory. Dieser Code verwendet die LDAP-Directory-Anbieter.

Der Code in die Seite Logon.aspx Ruft die LdapAuthentication.IsAuthenticated -Methode und übergibt die Anmeldeinformationen, die vom gesammelt wurden die Benutzer. Klicken Sie dann, ein DirectoryEntry -Objekt mit dem Pfad zur Verzeichnisstruktur, die Benutzer erstellt Namen, und das Kennwort. Der Benutzername muss im Format "Domäne\Benutzername" sein. Das DirectoryEntry -Objekt versucht, die Bindung ' AdsObject ' erzwingen, indem Sie die Eigenschaft "NativeObject" abrufen. Wenn dies erfolgreich ist, wird das CN -Attribut für den Benutzer ein DirectorySearcher -Objekt erstellen und eine Filterung auf den "samAccountName"abgerufen. Nachdem der Benutzer authentifiziert ist, gibt die IsAuthenticated -Methode truezurück.

Um eine Liste der Gruppen zu erhalten, die der Benutzer angehört Dieser Code Ruft die LdapAuthentication.GetGroups -Methode. Die LdapAuthentication.GetGroups -Methode ruft eine Liste der Sicherheit und ## Distribution groups, die der Benutzer gehört zu, indem Sie ein DirectorySearcher -Objekt erstellen und durch das Filtern nach das MemberOf -Attribut. Diese Methode gibt eine Liste der Gruppen, die getrennt sind von Pipes (|).

Beachten Sie, dass die LdapAuthentication.GetGroups -Methode bearbeitet und Zeichenfolgen schneidet. Dies reduziert die Länge die Zeichenfolge, die in das Authentifizierungscookie gespeichert ist. Wenn die Zeichenfolge nicht ist abgeschnitten wird, wird das Format der einzelnen Gruppen wie folgt angezeigt.
CN=...,...,DC=domain,DC=com
				
Dies kann eine sehr lange Zeichenfolge erstellen. Wenn die Länge dieser Zeichenfolge ist größer als die Länge des Cookies, können Browser das Authentifizierungs-Cookie nicht akzeptieren, und Sie werden zur Anmeldeseite umgeleitet. Allerdings Wenn Sie in einer Umgebung mit mehreren Domänen befinden, müssen Sie möglicherweise den Domain-Namen zu behalten mit der Gruppe benennen, da Gruppen in verschiedenen Domänen haben, können die gleichen Gruppennamen. Sie müssen den Domänennamen zu einer Gruppe unterscheiden behalten von einem anderen.

Die meisten Browser unterstützen Cookies von bis zu 4096 Bytes. Wenn diese Zeichenfolge potenziell kann überschreiten Sie die Länge des Cookies, Sie möchten die Informationen in dem ASP.NET Cache-Objekt oder in speichern ein Datenbank. Alternativ: Sie möchten die Informationen zu verschlüsseln und Speichern Sie diese Informationen in ein verborgenes Formularfeld eintragen.

Schreiben Sie den Code "Global.asax"

Der Code in der Datei Global.asax enthält einen Ereignishandler Application_AuthenticateRequest . Dieser Ereignishandler ruft die Authentifizierung Cookie aus der Auflistung Context.Request.Cookies entschlüsselt das Cookie, und ruft die Liste der Gruppen die in der FormsAuthenticationTicket.UserData -Eigenschaft gespeichert werden. Die Gruppen in eine Pipe getrennte Liste, die angezeigt werden in die Seite Logon.aspx erstellt.

Der Code analysiert die Zeichenfolge in ein String-Array ein GenericPrincipal -Objekt zu erstellen. Nachdem das GenericPrincipal -Objekt erstellt wurde, wird dieses Objekt in der Eigenschaft HttpContext.User platziert.
  1. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste "Global.asax", und klicken Sie dann auf Code anzeigen.
  2. Fügen Sie den folgenden Code am Anfang des Code-behind Datei Global.asax.cs:
    using System.Web.Security;
    using System.Security.Principal;
    					
  3. Ersetzen Sie den vorhandenen leeren Ereignishandler für die Application_AuthenticateRequest mit den folgenden Code.
    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;
    	
    }
    					

Ändern Sie die Web.config-Datei

In diesem Abschnitt Konfigurieren Sie die <forms> </forms>, die <authentication> </authentication>, und die <authorization></authorization> Elemente in der Datei Web.config. Durch diese Änderungen nur Authentifizierte Benutzer können die Anwendungen und nicht authentifizierten Anfragen zugreifen. werden zu einer Seite Logon.aspx umgeleitet. Sie können diese Konfiguration zu ändern. erlauben Sie nur bestimmte Benutzer und Gruppen Zugriff auf die Anwendung.

Ersetzen Sie den vorhandenen Code in der Datei Web.config, durch den folgenden Code.
<?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>
				
Beachten Sie die <identity impersonate="true"></identity> -Konfigurationselement. Dies bewirkt, dass ASP.NET zum Imitieren der Konto, das als anonymes Konto von Microsoft Internet konfiguriert ist Informationsdienste (IIS). Aufgrund dieser Konfiguration alle Anforderungen an Diese Anwendung im Sicherheitskontext des konfigurierten Konto ausgeführt. Die Benutzer stellt Anmeldeinformationen zur Authentifizierung gegenüber dem Active Directory bereit, aber die Konto, das die Active Directory zugreift, ist das konfigurierte Konto. Weitere Informationen Informationen hierzu finden Sie unter der InformationsquellenAbschnitt.

Konfigurieren von IIS für die anonyme Authentifizierung

Um IIS für die anonyme Authentifizierung zu konfigurieren, führen Sie die folgenden Schritte:
  1. Klicken Sie in IIS erweitern Sie den Knoten des Computers für Ihren Server, erweitern Sie Web-Sites, erweitern Sie Standard-Website, mit der rechten Maustaste FormsAuthAd, und klicken Sie dann auf Eigenschaften.
  2. Klicken Sie auf der Registerkarte Verzeichnissicherheit, und klicken Sie dann auf Bearbeiten Klicken Sie unter Anonymen Zugriff und Authentifizierungsüberwachung.
  3. Stellen Sie dem anonymen Konto für die Anwendung ein Konto die Berechtigung zum Active Directory hat.
  4. Klicken Sie auf das Kontrollkästchen IIS zum Steuerelement des Kennworts zulassen deaktivieren.
  5. Deaktivieren Sie das Kontrollkästchen "Integrierte Windows-Authentifizierung", in dem Abschnitt "Authentifizierter Zugriff".
  6. Klicken Sie auf OK.
  7. Klicken Sie auf Übernehmen
Standardmäßig IUSR_ComputernameKonto verfügt nicht über die Berechtigung an Active Directory.

Die Seite Logon.aspx erstellen

Gehen Sie folgendermaßen vor, um ein neues ASP.NET Web Form namens erstellen Logon.aspx:
  1. Im Projektmappen-Explorer mit der rechten Maustaste des Projektknoten, zeigen Sie auf Hinzufügenund klicken Sie dann auf Web Form hinzufügen.
  2. Typ Logon.aspx in den Namen ein, und klicken Sie dann auf Öffnen.
  3. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste Logon.aspx, und klicken Sie dann auf Ansicht-Designer.
  4. Klicken Sie auf die Registerkarte HTML im Designer.
  5. Ersetzen Sie den vorhandenen Code durch folgenden 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. Ändern Sie den Pfad in die Seite Logon.aspx auf Ihre LDAP-Verzeichnisserver.
Die Seite Logon.aspx ist eine Seite, die die Informationen werden gesammelt der Benutzer ein, und rufen Methoden auf die LdapAuthentication -Klasse. Nachdem der Code den Benutzer authentifiziert und eine Liste erhält Gruppen, der Code erstellt eine FormsAuthenticationTicket -Objekt, verschlüsselt das Ticket, fügt das verschlüsselte Ticket ein Cookie, das Cookie HttpResponse.Cookies -Auflistung hinzugefügt, und leitet die Anforderung an die URL, die wurde ursprünglich angefordert.

Ändern Sie die Seite "WebForm1.aspx"

Die Seite "WebForm1.aspx" wird die Seite, die ursprünglich angefordert wird. Wenn der Benutzer diese Seite anfordert, wird die Anforderung an die Logon.aspx umgeleitet. Seite. Nachdem die Anforderung authentifiziert wurde, wird die Anforderung umgeleitet zu: die Seite "WebForm1.aspx".
  1. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste "WebForm1.aspx", und klicken Sie dann auf Ansicht-Designer.
  2. Klicken Sie auf die Registerkarte HTML im Designer.
  3. Ersetzen Sie den vorhandenen Code durch folgenden 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. Speichern Sie alle Dateien, und kompilieren Sie das Projekt.
  5. Fordern Sie die Seite "WebForm1.aspx". Beachten Sie, die Sie auf Logon.aspx umgeleitet.
  6. Geben Sie die Anmeldeinformationen, und klicken Sie dann auf Senden. Wenn Sie in WebForm1.aspx umgeleitet werden, beachten Sie, dass Ihre Benutzer Name wird angezeigt, und diese LdapAuthentication ist der Authentifizierungstyp für die Context.User.AuthenticationType -Eigenschaft.
Hinweis Microsoft empfiehlt die Verwendung von Secure Sockets Layer (SSL) Bei der Verwendung der Formularauthentifizierung Verschlüsselung. Dies ist, da der Benutzer ist identifiziert anhand der Authentifizierungs-Cookie und SSL-Verschlüsselung auf diesem Anwendung verhindert das Authentifizierungscookie oder eine Beeinträchtigung andere wichtige Informationen, die übertragen werden.

Informationsquellen

Weitere Informationen finden Sie die folgenden Artikelnummern klicken, um die Artikel der Microsoft Knowledge Base:
306590ASP.NET Sicherheit (Übersicht)
317012 Prozess- und Anforderungsidentität in ASP.NET
311495 Wie Sie rollenbasierte Sicherheit mit formularbasierte Authentifizierung in Ihrer Anwendung ASP.NET implementieren, indem Sie mit Visual C# .NET
313091 How to create Keys mithilfe von Visual Basic .NET for Use in Forms authentication
313116 Forms Authentication Requests werden nicht zu LoginUrl Seite geleitet.

Eigenschaften

Artikel-ID: 316748 - Geändert am: Donnerstag, 29. November 2012 - Version: 8.0
Die Informationen in diesem Artikel beziehen sich auf:
  • Microsoft Visual C# .NET 2003 Standard Edition
  • Microsoft Visual C# .NET 2002 Standard Edition
  • Microsoft ASP.NET 1.1
  • Microsoft ASP.NET 1.0
Keywords: 
kbconfig kbcookie kbhowtomaster kbsecurity kbwebforms kbmt KB316748 KbMtde
Maschinell übersetzter Artikel
Wichtig: Dieser Artikel wurde maschinell und nicht von einem Menschen übersetzt. Die Microsoft Knowledge Base ist sehr umfangreich und ihre Inhalte werden ständig ergänzt beziehungsweise überarbeitet. Um Ihnen dennoch alle Inhalte auf Deutsch anbieten zu können, werden viele Artikel nicht von Menschen, sondern von Übersetzungsprogrammen übersetzt, die kontinuierlich optimiert werden. Doch noch sind maschinell übersetzte Texte in der Regel nicht perfekt, insbesondere hinsichtlich Grammatik und des Einsatzes von Fremdwörtern sowie Fachbegriffen. Microsoft übernimmt keine Gewähr für die sprachliche Qualität oder die technische Richtigkeit der Übersetzungen und ist nicht für Probleme haftbar, die direkt oder indirekt durch Übersetzungsfehler oder die Verwendung der übersetzten Inhalte durch Kunden entstehen könnten.
Den englischen Originalartikel können Sie über folgenden Link abrufen: 316748
Microsoft stellt Ihnen die in der Knowledge Base angebotenen Artikel und Informationen als Service-Leistung zur Verfügung. Microsoft übernimmt keinerlei Gewährleistung dafür, dass die angebotenen Artikel und Informationen auch in Ihrer Einsatzumgebung die erwünschten Ergebnisse erzielen. Die Entscheidung darüber, ob und in welcher Form Sie die angebotenen Artikel und Informationen nutzen, liegt daher allein bei Ihnen. Mit Ausnahme der gesetzlichen Haftung für Vorsatz ist jede Haftung von Microsoft im Zusammenhang mit Ihrer Nutzung dieser Artikel oder Informationen ausgeschlossen.

Ihr Feedback an uns

 

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