Implementieren formularbasierter Authentifizierung in einer ASP.NET-Anwendung mit Visual Basic .NET

SPRACHE AUSWÄHLEN SPRACHE AUSWÄHLEN
Artikel-ID: 308157 - Produkte anzeigen, auf die sich dieser Artikel bezieht
Dieser Artikel wurde zuvor veröffentlicht unter D308157
Dieser Artikel ist eine Übersetzung des folgenden englischsprachigen Artikels der Microsoft Knowledge Base:
308157 How To Implement Forms-Based Authentication in Your ASP.NET Application by Using Visual Basic .NET
Bitte beachten Sie: Bei diesem Artikel handelt es sich um eine Übersetzung aus dem Englischen. Es ist möglich, dass nachträgliche Änderungen bzw. Ergänzungen im englischen Originalartikel in dieser Übersetzung nicht berücksichtigt sind. Die in diesem Artikel enthaltenen Informationen basieren auf der/den englischsprachigen Produktversion(en). Die Richtigkeit dieser Informationen in Zusammenhang mit anderssprachigen Produktversionen wurde im Rahmen dieser Übersetzung nicht getestet. Microsoft stellt diese Informationen ohne Gewähr für Richtigkeit bzw. Funktionalität zur Verfügung und übernimmt auch keine Gewährleistung bezüglich der Vollständigkeit oder Richtigkeit der Übersetzung.
Alles erweitern | Alles schließen

Auf dieser Seite

Zusammenfassung

Dieser Beitrag beschreibt das Implementieren formularbasierter Authentifizierung unter Verwendung einer Datenbank zum Speichern der Benutzer.

Voraussetzungen

Die folgende Liste führt die empfohlene Hardware, Software und Netzwerkinfrastruktur sowie die benötigten Service Packs auf:
  • Microsoft Visual Studio .NET
  • Microsoft SQL Server
  • Microsoft Internet Information Services (IIS) 5.0 oder höher

Erstellen einer ASP.NET-Anwendung mit Visual Basic .NET

  1. Öffnen Sie Visual Studio .NET.
  2. Erstellen Sie eine neue ASP.NET-Webanwendung, und geben Sie den Namen und den Pfad an.

Konfigurieren der Sicherheitseinstellungen in der Datei "Web.config"

Dieser Abschnitt zeigt das Hinzufügen und Bearbeiten der Konfigurationsabschnitte <authentication> und <authorization> zum Konfigurieren der ASP.NET-Anwendung für die Verwendung formularbasierter Authentifizierung.
  1. Öffnen Sie die Datei "Web.config" im Projektmappen-Explorer.
  2. Ändern Sie den Authentifizierungsmodus in Formulare.
  3. Fügen Sie das Tag <Forms> ein, und geben Sie die entsprechenden Attribute an. (Weitere Informationen über diese Attribute finden Sie in der MSDN-Dokumentation oder in der QuickStart-Dokumentation, die im Abschnitt Informationsquellen aufgelistet ist.) Kopieren Sie den folgenden Code, und klicken Sie anschließend im Menü Bearbeiten auf Als HTML einfügen, um den Code in den Abschnitt <authentication> der folgenden Datei einzufügen:
    <authentication mode="Forms">
    	<forms name=".ASPXFORMSDEMO" loginUrl="logon.aspx" 
    	protection="All" path="/" timeout="30" />
    </authentication>
    					
  4. Verweigern Sie dem anonymen Benutzer den Zugriff im Abschnitt <authorization> auf folgende Weise:
    <authorization>
    	<deny users ="?" />
    	<allow users = "*" />
    </authorization>
    					

Erstellen einer Datenbank-Beispieltabelle zum Speichern von Benutzerdetails

Dieser Abschnitt zeigt das Erstellen einer Beispieldatenbank zum Speichern des Benutzernamens, des Kennworts und der Rolle für die Benutzer. Sie benötigen die Rollenspalte, wenn Sie Benutzerrollen in der Datenbank speichern und rollenbasierte Sicherheit implementieren möchten.
  1. Klicken Sie im Windows-Menü Start auf Ausführen, und geben Sie den Befehl notepad ein, um den Editor zu öffnen.
  2. Markieren Sie den folgenden SQL-Skriptcode, klicken Sie mit der rechten Maustaste auf den Code, und klicken Sie dann auf Kopieren. Klicken Sie im Editor im Menü Bearbeiten auf Einfügen, um den folgenden Code einzufügen:
    if exists (select * from sysobjects where id = 
    object_id(N'[dbo].[Users]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    drop table [dbo].[Users]
    GO
    CREATE TABLE [dbo].[Users] (
    	[uname] [varchar] (15) NOT NULL ,
    	[Pwd] [varchar] (25) NOT NULL ,
    	[userRole] [varchar] (25) NOT NULL ,
    ) ON [PRIMARY]
    GO
    ALTER TABLE [dbo].[Users] WITH NOCHECK ADD 
    	CONSTRAINT [PK_Users] PRIMARY KEY  NONCLUSTERED 
    	(
    		[uname]
    	)  ON [PRIMARY] 
    GO
    
    INSERT INTO Users values('user1','user1','Manager')
    INSERT INTO Users values('user2','user2','Admin')
    INSERT INTO Users values('user3','user3','User')
    GO
    					
  3. Speichern Sie die Datei unter dem Namen "Users.sql".
  4. Öffnen Sie die Datei "Users.sql" auf dem Microsoft SQL Server-Computer im Query Analyzer. Klicken Sie in der Liste der Datenbanken auf pubs, und führen Sie das Skript aus. Es wird eine Benutzerbeispieltabelle erstellt, und die Tabelle in der Pubs-Datenbank wird mit Daten aufgefüllt, die in dieser Beispielanwendung verwendet werden.

Erstellen einer Seite "Logon.aspx"

  1. Fügen Sie zu dem Projekt ein neues Webformular namens "Logon.aspx" hinzu.
  2. Öffnen Sie die Seite "Logon.aspx" im Editor, und wechseln Sie dann in die HTML-Ansicht.
  3. Kopieren Sie den folgenden Code, und verwenden Sie dann im Menü Bearbeiten die Option Als HTML einfügen, um den Code zwischen den <form>-Tags einzufügen:
    <h3>
       <font face="Verdana">Logon Page</font>
    </h3>
    <table>
       <tr>
          <td>Email:</td>
          <td><input id="txtUserName" type="text" runat="server"></td>
          <td><ASP:RequiredFieldValidator ControlToValidate="txtUserName"
               Display="Static" ErrorMessage="*" runat="server" 
               ID="vUserName" /></td>
       </tr>
       <tr>
          <td>Password:</td>
          <td><input id="txtUserPass" type="password" runat="server"></td>
          <td><ASP:RequiredFieldValidator ControlToValidate="txtUserPass"
              Display="Static" ErrorMessage="*" runat="server" 
              ID="vUserPass" />
          </td>
       </tr>
       <tr>
          <td>Persistent Cookie:</td>
          <td><ASP:CheckBox id="chkPersistCookie" runat="server" autopostback="false" /></td>
          <td></td>
       </tr>
    </table>
    <input type="submit" Value="Logon" runat="server" ID="cmdLogin"><p></p>
    <asp:Label id="lblMsg" ForeColor="red" Font-Name="Verdana" Font-Size="10" runat="server" />
    						
    Dieses Webformular wird zum Bereitstellen eines Anmeldeformulars für Benutzer verwendet, damit diese den Benutzernamen und das Kennwort bereitstellen können, um sich bei der Anwendung anzumelden.
  4. Wechseln Sie in die Entwurfsansicht, und speichern Sie dann die Seite.

Codieren der Ereignisbehandlungsroutine zum Überprüfen der Benutzeranmeldeinformationen

Dieser Abschnitt zeigt den Code, der in die CodeBehind-Seite ("Logon.aspx.vb") eingefügt wird.
  1. Öffnen Sie die Datei "Logon.aspx.vb".
  2. Importieren Sie die erforderlichen Namespaces in die CodeBehind-Datei:
    Imports System.Data.SqlClient
    Imports System.Web.Security
    					
  3. Erstellen Sie eine Funktion ValidateUser zum Überprüfen der Benutzeranmeldeinformationen durch Durchsuchen der Datenbank. (Stellen Sie sicher, dass Sie die Verbindungszeichenfolge so ändern, dass sie auf Ihre Datenbank verweist.)
    Private Function ValidateUser(ByVal userName As String, ByVal passWord As String) As Boolean
            Dim conn As SqlConnection
            Dim cmd As SqlCommand
            Dim lookupPassword As String
    
            lookupPassword = Nothing
    
            ' Check for an invalid userName.
            ' userName  must not be set to nothing and must be between one and 15 characters.
            If ((userName Is Nothing)) Then
                System.Diagnostics.Trace.WriteLine("[ValidateUser] Input validation of userName failed.")
                Return False
            End If
            If ((userName.Length = 0) Or (userName.Length > 15)) Then
                System.Diagnostics.Trace.WriteLine("[ValidateUser] Input validation of userName failed.")
                Return False
            End If
    
            ' Check for invalid passWord.
            ' passWord must not be set to nothing and must be between one and 25 characters.
            If (passWord Is Nothing) Then
                System.Diagnostics.Trace.WriteLine("[ValidateUser] Input validation of passWord failed.")
                Return False
            End If
            If ((passWord.Length = 0) Or (passWord.Length > 25)) Then
                System.Diagnostics.Trace.WriteLine("[ValidateUser] Input validation of passWord failed.")
                Return False
            End If
    
            Try
                ' Consult with your SQL Server administrator for an appropriate connection
                ' string to use to connect to your local SQL Server.
                conn = New SqlConnection("server=localhost;Integrated Security=SSPI;database=pubs")
                conn.Open()
    
                ' Create SqlCommand to select pwd field from the users table given a supplied userName.
                cmd = New SqlCommand("Select pwd from users where uname=@userName", conn)
                cmd.Parameters.Add("@userName", SqlDbType.VarChar, 25)
                cmd.Parameters("@userName").Value = userName
    
    
                ' Execute command and fetch pwd field into lookupPassword string.
                lookupPassword = cmd.ExecuteScalar()
    
                ' Cleanup command and connection objects.
                cmd.Dispose()
                conn.Dispose()
            Catch ex As Exception
                ' Add error handling here for debugging.
                ' This error message should not be sent back to the caller.
                System.Diagnostics.Trace.WriteLine("[ValidateUser] Exception " & ex.Message)
            End Try
    
            ' If no password found, return false.
            If (lookupPassword Is Nothing) Then
                ' You could write failed login attempts here to the event log for additional security.
                Return False
            End If
    
            ' Compare lookupPassword and input passWord by using a case-sensitive comparison.
            Return (String.Compare(lookupPassword, passWord, False) = 0)
    
    End Function
    					
  4. Sie können eine von zwei Methoden zum Generieren des Formularauthentifizierungscookies verwenden und den Benutzer im Ereignis cmdLogin_ServerClick an eine entsprechende Seite umleiten. Beispielcode wird für beide Szenarien zur Verfügung gestellt. Verwenden Sie die Methode, die Ihren Anforderungen entspricht.
    • Rufen Sie die Methode RedirectFromLoginPage zum automatischen Generieren des Formularauthentifizierungscookies und zum Umleiten des Benutzers im Ereignis cmdLogin_ServerClick an eine entsprechende Seite auf:
      Private Sub cmdLogin_ServerClick(ByVal sender As Object, ByVal e As System.EventArgs) _
         Handles cmdLogin.ServerClick
         If ValidateUser(txtUserName.Value,txtUserPass.value) Then
            FormsAuthentication.RedirectFromLoginPage(txtUserName.Value, _
            chkPersistCookie.Checked)
         Else
            Response.Redirect("logon.aspx", True)
         End If
      End Sub
      						
    • Generieren Sie das Authentifizierungsticket, verschlüsseln Sie es, erstellen Sie ein Cookie, fügen Sie dieses zu der Antwort hinzu, und leiten Sie dann den Benutzer um. Sie erhalten auf diese Weise eine bessere Kontrolle über die Art der Cookieerstellung. Sie können in diesem Fall auch benutzerdefinierte Daten in das FormsAuthenticationTicket einschließen.
      Private Sub cmdLogin_ServerClick(ByVal sender As Object, _
         ByVal e As System.EventArgs) Handles cmdLogin.ServerClick
         If Validateuser(txtUserName.Value,txtUserPass.Value) Then
            Dim tkt As FormsAuthenticationTicket
            Dim cookiestr As String
            Dim ck As HttpCookie
      
            tkt = New FormsAuthenticationTicket(1, txtUserName.Value, DateTime.Now(), _
      dateTime.Now.AddMinutes(30), chkPersistCookie.Checked, "your custom data")
            cookiestr = FormsAuthentication.Encrypt(tkt)
            ck = new HttpCookie(FormsAuthentication.FormsCookieName(), cookiestr)
            if (chkPersistCookie.Checked) then ck.Expires=tkt.Expiration 
            ck.Path = FormsAuthentication.FormsCookiePath() 
            Response.Cookies.Add(ck)
      
            Dim strRedirect As String
            strRedirect = Request("ReturnURL")
            If strRedirect <> "" Then
               Response.Redirect(strRedirect, True)
            Else
               strRedirect = "default.aspx"
               Response.Redirect(strRedirect, True)
            End If
         Else
            Response.Redirect("logon.aspx", True)
         End If
      End Sub
      						

Erstellen einer Seite "Default.aspx"

Dieser Abschnitt beschreibt das Erstellen einer Testseite, an die Benutzer nach der Authentifizierung umgeleitet werden. Wenn Benutzer zu dieser Seite wechseln, ohne sich zuvor bei der Anwendung angemeldet zu haben, werden sie an die Anmeldeseite umgeleitet.
  1. Benennen Sie die vorhandene Seite "WebForm1.aspx" in "Default.aspx" um, und öffnen Sie diese dann im Editor.
  2. Wechseln Sie in die HTML-Ansicht, und kopieren Sie dann den folgenden Code zwischen die <form>-Tags:
    <input type="submit" Value="SignOut" runat="server" id="cmdSignOut">
    						
    Diese Schaltfläche wird zum Abmelden der Formularauthentifizierungssitzung verwendet.
  3. Wechseln Sie in die Entwurfsansicht, und speichern Sie dann die Seite.
  4. Importieren Sie die erforderlichen Namespaces in die CodeBehind-Datei:
    Imports System.Web.Security
    					
  5. Öffnen Sie die CodeBehind-Seite ("Default.aspx.vb"), und kopieren Sie dann den folgenden Code in die Ereignisbehandlungsroutine cmdSignOut_ServerClick:
    Private Sub cmdSignOut_ServerClick(ByVal sender As System.Object, ByVal e As System.EventArgs) _
    Handles cmdSignOut.ServerClick
       FormsAuthentication.SignOut()
       Response.Redirect("logon.aspx", True)
    End Sub
    					
  6. Speichern und kompilieren Sie das Projekt. Sie können die Anwendung nun verwenden.

Problembehandlung

  • Sie möchten Kennwörter möglicherweise sicher in einer Datenbank speichern. Sie können die Dienstprogrammfunktion namens HashPasswordForStoringInConfigFile der Klasse FormsAuthentication zum Verschlüsseln der Kennwörter verwenden, bevor Sie diese in der Datenbank oder Konfigurationsdatei speichern.
  • Sie können die SQL-Verbindungsinformationen in der Konfigurationsdatei ("Web.config") speichern, damit Sie diese bei Bedarf auf einfache Weise ändern können.
  • Außerdem können Sie ggf. Code hinzufügen, der verhindert, dass sich Hacker anmelden können, die verschiedene Kennwortkombinationen verwenden. Sie können z. B. Programmlogik integrieren, die nur zwei oder drei Anmeldeversuche gestattet. Wenn sich ein Benutzer mit einer bestimmten Anzahl von Anmeldeversuchen nicht anmelden kann, können Sie ein Flag in der Datenbank einrichten, das dem Benutzer die Anmeldung verweigert, bis dieser sein Konto erneut durch Besuchen einer anderen Seite oder durch Kontaktaufnahme mit Ihrem Support aktiviert. Außerdem sollten Sie entsprechende Fehlerbehandlung vorsehen, wo dies erforderlich ist.
  • Da der Benutzer basierend auf dem Authentifizierungscookie identifiziert wird, können Sie SSL (Secure Sockets Layer) für die Anwendung verwenden, damit niemand das Authentifizierungscookie oder andere wichtige Informationen abfangen kann, die übertragen werden.
  • Formularbasierte Authentifizierung verlangt, dass der Client Cookies im Browser annimmt oder aktiviert.
  • Der Parameter timeout des Konfigurationsabschnitts <authentication> steuert das Intervall, in dem das Authentifizierungscookie erneut generiert wird. Sie können einen Wert wählen, der bessere Leistung und Sicherheit gewährleistet.
  • Bestimmte zwischengeschaltete Proxies und Caches im Internet können Webserverantworten zwischenspeichern, die Set-Cookie-Kopfzeilen enthalten und anschließend möglicherweise an einen anderen Benutzer zurückgegeben werden. Da die formularbasierte Authentifizierung ein Cookie zum Authentifizieren von Benutzern verwendet, kann es vorkommen, dass ein Benutzer zufällig (oder absichtlich) die Identität eines anderen Benutzers annimmt, indem ein Cookie von einem zwischengeschalteten Proxy oder Cache empfangen wird, das ursprünglich nicht für diesen Benutzer gedacht war.

Informationsquellen

Informationen zum Implementieren einfacher formularbasierter Authentifizierung durch Verwenden des Abschnitts <credentials> zum Speichern von Benutzern und Kennwörtern finden Sie in folgendem Artikel in den ASP.NET QuickStart-Beispielen:
Formularbasierte Authentifizierung
http://samples.gotdotnet.com/quickstart/aspplus/default.aspx?url=/quickstart/aspplus/doc/formsauth.aspx
Informationen zum Implementieren formularbasierter Authentifizierung durch Verwenden einer XML-Datei (Extensible Markup Language) zum Speichern von Benutzern und Kennwörtern finden Sie unter folgendem Thema in der .NET Framework Software Development Kit (SDK)-Dokumentation:
Forms Authentication Using An XML Users File (Formularauthentifizierung mithilfe einer XML-Benutzerdatei)
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconcookieauthenticationusinganxmlusersfile.asp
Weitere Informationen zur Sicherheit von ASP.NET-Webanwendungen finden Sie in folgendem Beitrag der .NET Framework SDK-Dokumentation:
ASP.NET Web Application Security (Sicherheit von ASP.NET-Webanwendungen)
http://msdn2.microsoft.com/en-us/library/330a99hc(vs.71).aspx
Weitere Informationen zum Namespace System.Web.Security finden Sie in folgendem Beitrag der .NET Framework SDK-Dokumentation:
http://msdn.microsoft.com/library/dotnet/cpref/frlrfsystemwebsecurity.htm
Weitere Informationen zur ASP.NET-Konfiguration finden Sie in den folgenden .NET Framework SDK-Artikeln:
ASP.NET Configuration (ASP.NET-Konfiguration)
http://msdn2.microsoft.com/en-us/library/aa719558(VS.71).aspx

ASP.NET Configuration Sections (ASP.NET-Konfigurationsabschnitte)
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpgrfaspnetconfigurationsections.asp
Informationen zu ASP.NET-Sicherheitsrichtlinien finden Sie im folgenden MSDN-Whitepaper:
Authentication in ASP.NET: .NET Security Guidance (Authentifizierung in ASP.NET: .NET-Sicherheitsrichtlinien)
http://msdn2.microsoft.com/en-us/library/ms978378.aspx
Allgemeine Informationen zu ASP.NET finden Sie in der folgenden MSDN-Newsgroup:
microsoft.public.dotnet.framework.aspnet
Weitere Informationen finden Sie in folgenden Büchern:
Esposito, Dino. Building Web Solutions with ASP.NET and ADO.NET Microsoft Press, 2001.

Howard, Michael und David LeBlanc. Writing Secure Code. Microsoft Press, 2001.

Eigenschaften

Artikel-ID: 308157 - Geändert am: Montag, 29. Oktober 2007 - Version: 8.8
Die Informationen in diesem Artikel beziehen sich auf:
  • Microsoft ASP.NET 1.1
  • Microsoft ASP.NET 1.0
  • Microsoft Visual Basic .NET 2003 Standard Edition
  • Microsoft Visual Basic .NET 2002 Standard Edition
  • Microsoft SQL Server 2000 Standard Edition
  • Microsoft SQL Server 7.0 Standard Edition
Keywords: 
kbproductlink kbconfig kbhowtomaster kbsecurity kbweb KB308157
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