Wie Authentifizieren in dem Active Directory, indem Formularauthentifizierung und Visual Basic .NET verwendet

SPRACHE AUSWÄHLEN SPRACHE AUSWÄHLEN
Artikel-ID: 326340 - Produkte anzeigen, auf die sich dieser Artikel bezieht
Alles erweitern | Alles schließen

Auf dieser Seite

Zusammenfassung

Dieser Artikel beschreibt Schritt für Schritt, wie eine Anwendung von ASP.NET Formularauthentifizierung verwenden kann zu Benutzern erlauben sich in dem Active Directory zu authentifizieren, indem Benutzer das LDAP verwenden.

Das können Sie der Application AuthenticateRequest Methode der Datei Global.asax entweder verwenden, um ein GenericPrincipal Objekt in der Eigenschaft HttpContext.User zu speichern, die durch die Anforderung fließt, nachdem der Benutzer authentifiziert und umgeleitet wird.

Erstellen Sie eine Asp.net-webanwendung in Visual Basic .NET

Gehen Sie folgendermaßen vor, um eine neue Anwendung von Asp.net-webanwendung mit Name FormsAuthAd in Visual Basic .NET zu erstellen:
  1. Starten Sie Microsoft Visual Studio .NET.
  2. Klicken Sie in dem Menü Datei auf Neu, und klicken Sie dann auf Projekt.
  3. Klicken Sie auf Visual Basic-Projekte unter Projekttypen, und klicken Sie dann auf Asp.net-webanwendung unter Vorlagen.
  4. In dem Feld gibt Sie an <B> http:// <Server> Orts ein/ FormsAuthAd </B> (das http://localhost Ersetzt, wenn Sie den lokalen Server (zu dem Haben von http://localhost/FormsAuthAd und dann zu dem Klicken auf OK) verwenden)
  5. Klicken Sie mit der rechten Maustaste auf den Knoten Verweise in Projekt-Mappe-Explorer, und klicken Sie dann auf Verweis hinzufügen.
  6. Klicken Sie auf System.DirectoryServices.dll, klicken Sie auf Auswählen, und klicken Sie dann auf OK auf die Registerkarte in .NET in dem Dialogfeld Verweis hinzufügen.

Verfassen Sie den Authentifizierungscode

Gehen Sie folgendermaßen vor, um eine neue Klassendatei mit Name LdapAuthentication.vb zu erstellen:
  1. Klicken Sie mit der rechten Maustaste in dem Projektmappen-Explorer auf den Projektknoten, zeigen Sie auf Add, und klicken Sie dann auf Neues Element hinzufügen.
  2. Klicken Sie auf Klasse unter Vorlagen.
  3. Typ LdapAuthentication.vb Auf Öffnen ein Sie und klicken Sie dann auf Öffnen, in Name.
  4. Ersetzen Sie den vorhandenen Code in der LdapAuthentication.vb-Datei durch den folgenden Code:
    Imports System
    Imports System.Text
    Imports System.Collections
    Imports System.DirectoryServices
    
    Namespace 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 Class
    End Namespace
    
    
    					

Erläuterung zu dem Code

Der Authentifizierungscode weist eine Domäne, einen Benutzername, ein Kennwort und einen Pfad zu der Struktur in dem Active Directory zurück. Dieser Code verwendet den LDAP-Verzeichnis-Anbieter.
Benutzerauthentifizierung
Der Code in der Seite Logon.aspx ruft die LdapAuthentication.IsAuthenticated Methode auf und wird in den An-Meldeinformation übergeben, die von dem Benutzer gesammelt werden. Mit dem Pfad zu der Verzeichnis-Struktur, dem Benutzername und dem Kennwort wird anschließend ein DirectoryEntry Objekt erstellt. Der Benutzername muss in dem Format "Domäne\Benutzername" angegeben werden. Das DirectoryEntry Objekt versucht dann, die Bindung von AdsObject zu erzwingen, indem das DirectoryEntry Objekt die NativeObject Eigenschaft abruft. Wenn das erfolgreich ist, wird das CN Attribut für den Benutzer DirectorySearcher durch ein -Objekt erstellen, und das Filtern des SAMAccountName erhalten. Nachdem der Benutzer authentifiziert wird, gibt die IsAuthenticated Methode True zurück.

Hinweis: wenn Sie LDAP verwenden, um auf einem Active Directory-Bezogenen Objekt zu binden, werden TCP-Ports verwandt. Erhöhte Verwendung von LDAP mit dem Namespace System.DirectoryServices verwendet möglicherweise alle TCP-Ports, die verfügbar sind. Ist möglicherweise in Lage, die TCP-Last durch das Wiederverwenden der Verbindung, die Sie zu Authentifizierung Ihres Benutzers verwendeten, zu reduzieren.
Benutzergruppe
Dieser Code ruft die LdapAuthentication.GetGroups Methode auf, um eine Liste zu Gruppen zu erhalten, zu denen der Benutzer gehört. Die LdapAuthentication.GetGroups Methode ruft eine Liste Sicherheits- zu denen der Benutzer an DirectorySearcher von ein -Objekt erstellen,, und Filter laut des Attributs MemberOf gehört und Verteilergruppen, zu denen der Benutzer an DirectorySearcher von ein -Objekt erstellen,, und Filter laut des Attributs MemberOf gehört,, ab. Diese Methode gibt eine Liste der Gruppen zurück, ist, durch Pipes (|) zu getrennt werden.

Beachten Sie, dass die LdapAuthentication.GetGroups Methode Zeichenfolgen bearbeitet, und abschneidet. Das reduziert die Länge der Zeichenfolge, die in dem Authentifizierungscookie gespeichert wird. Wenn die Zeichenfolge nicht abgeschnitten wird, sieht das Format jeder Gruppe folgendermaßen aus:
CN=...,...,DC=domain,DC=com
				
Das kann eine sehr lange Zeichenfolge erstellen. Wenn die Länge dieser Zeichenfolge größer als die Länge des Cookies ist, wird das Authentifizierungscookie möglicherweise nicht erstellt. Wenn potenziell diese Zeichenfolge größer als die Länge des Cookies sein kann, möchten Sie die Gruppeninformation ASP.NET Cache in dem Objekt oder einer Datenbank speichern kann. Empfiehlt sich alternativ, Sie die Gruppeninformation zu verschlüsseln und diese Information in einem ausgeblendeten Formularfeld zu speichern.

Schreiben Sie das Global.asax Code

Der Code in der Datei Global.asax stellt ein Application AuthenticateRequest Ereignishandler bereit. Dieses Ereignishandler ruft das Authentifizierungscookie aus der Auflistung von Context.Request.Cookies ab, entschlüsselt das Cookie und ruft die Liste Gruppen, sein in der Eigenschaft FormsAuthenticationTicket.UserData gespeichert wird, ab. Die Gruppen werden bei einer pipe-separated Liste angezeigt, die der Seite Logon.aspx erstellt wird.

Der Code analysiert die Zeichenfolge in Zeichenfolgenarray, um ein GenericPrincipal Objekt zu erstellen. Nachdem das GenericPrincipal Objekt erstellt wird, wird dieses Objekt in der Eigenschaft HttpContext.User platziert.
  1. Klicken Sie in dem Projekt-Mappe-Explorer mit der rechten Maustaste auf Global.asax, und klicken Sie dann auf Code anzeigen.
  2. Fügen Sie den folgenden Code an dem Anfang des Codes hinter der Global.asax.vb-Datei hinzu:
    Imports System.Web.Security
    Imports System.Security.Principal
    					
  3. Ersetzen Sie durch den folgenden Code das vorhandene leere Ereignishandler für das Application AuthenticateRequest:
    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
    					

Ändern Sie die Datei Web.config

In diesem Abschnitt konfigurieren Sie das Forms, die Authentifizierung und die Autorisierung Elemente in der Datei Web.config. Mit diesen Änderungen können nur authentifizierte Benutzer auf die Anwendung zugreifen und unauthenticated Anforderungen werden an einer Seite Logon.aspx umgeleitet. Um nur bestimmte Benutzer und Gruppenzugriff auf die Anwendung zuzulassen, können Sie diese Konfiguration ändern.

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="60" path="/" >
      </forms>
    </authentication>	
    <authorization>	
      <deny users="?" />
      <allow users="*" />
    </authorization>	
    <identity impersonate="true" />
  </system.web>
</configuration>
				
Sie beachten, die <VAR>-Identität zu imitieren "echten" /</VAR>-Konfigurationselement (ASP.NET) =. Das verursacht, ASP.NET Identität des Kontos anzunehmen, das als das anonyme Konto von Microsoft Internet Information Services konfiguriert ist. Infolge dieser Konfiguration werden alle Anforderungen an diese Anwendung in dem Sicherheitskontext des konfigurierten Kontos ausgeführt. Der Benutzer gibt An-Meldeinformation an, Informationen in dem Active Directory zu authentifizieren, aber das Konto, das auf das Active Directory zugreift, ist das konfigurierte Konto. Weitere Informationen finden Sie im Abschnit VERWEISE Abschnitt.

Konfigurieren Sie für Anonyme Authentifizierung II

Gehen Sie folgendermaßen vor, um II für anonyme Authentifizierung zu konfigurieren:
  1. Klicken Sie mit der rechten Maustaste in der II-Verwaltungskonsole für "FormsAuthAd" auf den Knoten Virtuelles Verzeichnis.
  2. Klicken Sie auf die Eigenschaft, und klicken Sie dann auf die Registerkarte Verzeichnissicherheit.
  3. Klicken Sie auf Bearbeiten unter Anonymer Zugriff und Authentifizierungsüberwachung.
  4. Aktivieren Sie das Kontrolle-Kästchen anonymem Zugriff.
  5. Nehmen Sie dem anonymen Konto für die Anwendung ein Konto vor, das über Berechtigung in dem Active Directory verfügt.
  6. Deaktivieren Sie das Allow IIS To Control Password Kontrolle-Kästchen.
Das Standardkonto IUSR Computername hat keine Berechtigung in dem Active Directory.

Erstellen Sie die Seite Logon.aspx

Gehen Sie folgendermaßen vor, um ein neues ASP.NET Web Form zu erstellen, das als Logon.aspx bezeichnet wird:
  1. Klicken Sie mit der rechten Maustaste in dem Projektmappen-Explorer auf den Projektknoten, zeigen Sie auf Add, und klicken Sie dann auf Webformular hinzufügen.
  2. Typ Logon.aspx Auf Öffnen ein Sie und klicken Sie dann auf Öffnen, in Name.
  3. Klicken Sie in dem Projekt-Mappe-Explorer mit der rechten Maustaste auf Logon.aspx, und klicken Sie dann auf Sichtdesigner.
  4. Klicken Sie auf die Registerkarte HTML in dem Designer.
  5. Ersetzen Sie den dort vorhandenen Code durch den folgenden 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 try
    end sub
    </script>
    					
  6. Ändern Sie den Pfad auf der Seite Logon.aspx so, die Seite Logon.aspx auf Ihren LDAP-Verzeichnis-Server zu zeigen.
Die Seite Logon.aspx ist eine Seite, die die Information von den Benutzer- und den Call-Methode für die Klasse LdapAuthentication sammelt. Der Code führt folgende in dieser Reihenfolge durch, nachdem der Code den Benutzer authentifiziert und eine Liste der Gruppen abruft:
  • FormsAuthenticationTicket erstellt ein -Objekt;
  • verschlüsselt das Ticket;
  • Ein Cookie enthält das verschlüsselte Ticket;
  • Fügt das Cookie der Auflistung von HttpResponse.Cookies hinzu;
  • Leitet die Anforderung auf der URL, die ursprünglich angefordert wurde, um.

Ändern Sie die WebForm1.aspx-Seite

Die Seite WebForm1.aspx ist die Seite, die ursprünglich angefordert wird. Wenn der Benutzer diese Seite anfordert, wird die Anforderung an der Seite Logon.aspx umgeleitet. Nachdem die Anforderung authentifiziert wird, wird die Anforderung an der Seite WebForm1.aspx umgeleitet.
  1. Klicken Sie in dem Projekt-Mappe-Explorer mit der rechten Maustaste auf WebForm1.aspx, und klicken Sie dann auf Sichtdesigner.
  2. Klicken Sie auf die Registerkarte HTML in dem Designer.
  3. Ersetzen Sie den dort vorhandenen Code durch den folgenden Code
    <%@ 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. Speichern Sie alle Dateien, und kompilieren Sie dann das Projekt.
  5. Fordern Sie die Seite WebForm1.aspx an. Beachten Sie, dass Sie auf Logon.aspx umgeleitet werden.
  6. Geben Sie die An-Meldeinformation ein, und klicken Sie dann auf Submit. Beachten Sie, dass Ihr Benutzername angezeigt wird, und das LdapAuthentication der Authentifizierungstyp für die Eigenschaft Context.User.Identity.AuthenticationType ist, wenn Sie zu WebForm1.aspx umgeleitet werden.
Hinweis: Microsoft empfiehlt, dass Sie SSL-Verschlüsselung verwenden, wenn Sie Formularauthentifizierung verwenden. Das ist, da der Benutzer identifiziert wird auf dem Authentifizierungscookie basiert und SSL-Verschlüsselung für diese Anwendung jeder Person hindert, das Authentifizierungscookie und alle weitere wertvolle Information zu gefährden, gesandt wird, die übertragen wird.

Informationsquellen

Erhalten Sie Weitere Informationen, indem auf die folgenden Artikelanzahlen klickt, um die Artikel der Microsoft Knowledge Base zu lesen:
306590 ASP.NET-Sicherheitsübersicht
317012 Prozess- in ASP.NET und Anforderungsidentität in ASP.NET
306238 Wie Implementieren von rollenbasierter Sicherheit mit formularbasierter Authentifizierung in Ihrer Asp.net-anwendung, indem Visual Basic .NET verwendet
313091 Wie Erstellen von Schlüsseln, indem Visual Basic .NET für Verwendung bei Formularauthentifizierung verwendet
313116 Formularauthentifizierungsanforderungen werden zu LoginUrl-Seite nicht weitergeleitet

Eigenschaften

Artikel-ID: 326340 - Geändert am: Donnerstag, 22. März 2007 - Version: 4.5
Die Informationen in diesem Artikel beziehen sich auf:
  • Microsoft ASP.NET 1.0
  • Microsoft Visual Basic .NET 2002 Standard Edition
  • Microsoft ASP.NET 1.1
  • Microsoft Visual Basic .NET 2003 Standard Edition
Keywords: 
kbconfig kbcookie kbhowtomaster kbsecurity kbwebforms KB326340 KbMtde kbmt
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: 326340
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