Sie sind zurzeit offline. Es wird auf die erneute Herstellung einer Internetverbindung gewartet.

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

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
Zusammenfassung
Dieser Beitrag beschreibt das Implementieren formularbasierter Authentifizierung unter Verwendung einer Datenbank zum Speichern der Benutzer.

Zurück zum Anfang

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
Zurück zum Anfang

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.
Zurück zum Anfang

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>					
Zurück zum Anfang

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]GOCREATE TABLE [dbo].[Users] (	[uname] [varchar] (15) NOT NULL ,	[Pwd] [varchar] (25) NOT NULL ,	[userRole] [varchar] (25) NOT NULL ,) ON [PRIMARY]GOALTER TABLE [dbo].[Users] WITH NOCHECK ADD 	CONSTRAINT [PK_Users] PRIMARY KEY  NONCLUSTERED 	(		[uname]	)  ON [PRIMARY] GOINSERT 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.
Zurück zum Anfang

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.
Zurück zum Anfang

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.SqlClientImports 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 IfEnd 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 IfEnd Sub						
Zurück zum Anfang

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.
Zurück zum Anfang

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.
Zurück zum Anfang
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: 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: Weitere Informationen zur ASP.NET-Konfiguration finden Sie in den folgenden .NET Framework SDK-Artikeln: 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: 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.
Zurück zum Anfang
forms authentication
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.
Eigenschaften

Artikelnummer: 308157 – Letzte Überarbeitung: 10/29/2007 14:54:58 – Revision: 8.8

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

  • kbproductlink kbconfig kbhowtomaster kbsecurity kbweb KB308157
Feedback
amp;t=">