Dieser Artikel wurde zuvor veröffentlicht unter D308157
Dieser Artikel ist eine Übersetzung des folgenden englischsprachigen Artikels der Microsoft Knowledge Base: 308157
(http://support.microsoft.com/kb/308157/EN-US/
)
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.
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
Öffnen Sie Visual Studio .NET.
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.
Öffnen Sie die Datei "Web.config" im
Projektmappen-Explorer.
Ändern Sie den Authentifizierungsmodus in Formulare.
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:
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.
Klicken Sie im Windows-Menü Start auf Ausführen, und geben Sie den Befehl notepad ein, um
den Editor zu öffnen.
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
Speichern Sie die Datei unter dem Namen
"Users.sql".
Ö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"
Fügen Sie zu dem Projekt ein neues Webformular namens
"Logon.aspx" hinzu.
Öffnen Sie die Seite "Logon.aspx" im Editor, und wechseln
Sie dann in die HTML-Ansicht.
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:
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.
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.
Öffnen Sie die Datei "Logon.aspx.vb".
Importieren Sie die erforderlichen Namespaces in die
CodeBehind-Datei:
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
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.
Benennen Sie die vorhandene Seite "WebForm1.aspx" in
"Default.aspx" um, und öffnen Sie diese dann im Editor.
Wechseln Sie in die HTML-Ansicht, und kopieren Sie dann den
folgenden Code zwischen die <form>-Tags:
Diese Schaltfläche wird zum Abmelden der
Formularauthentifizierungssitzung verwendet.
Wechseln Sie in die Entwurfsansicht, und speichern Sie dann
die Seite.
Importieren Sie die erforderlichen Namespaces in die
CodeBehind-Datei:
Imports System.Web.Security
Ö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
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.
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:
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.
Danke! Dieses Feedback hilft uns dabei, die Supportartikel weiter zu verbessern. Weitere Informationen finden Sie auf der Hilfe und Support-Startseite.