Gewusst wie: Implementieren der einfachen Formularauthentifizierung
Aktualisiert: November 2007
Das Beispiel in diesem Thema zeigt eine einfache Implementierung der ASP.NET-Formularauthentifizierung. Es soll grundlegend vermitteln, wie Sie mit der Formularauthentifizierung Benutzer bei einer ASP.NET-Anwendung anmelden.
Hinweis: |
---|
Eine einfache Möglichkeit der Formularauthentifizierung besteht darin, ASP.NET-Mitgliedschaft und die ASP.NET-Anmeldesteuerelemente zu verwenden. Die ASP.NET-Mitgliedschaft bietet die Möglichkeit zum Speichern und Verwalten von Benutzerinformationen und stellt Methoden für die Benutzerauthentifizierung bereit. Die ASP.NET-Anmeldungssteuerelemente greifen auf die ASP.NET-Mitgliedschaft zurück und beinhalten die notwendige Logik, um den Benutzer zur Eingabe der Anmeldeinformationen aufzufordern, diese Informationen zu validieren, Kennwörter wiederherzustellen oder zu ersetzen u. v. m. ASP.NET-Mitgliedschaft und ASP.NET-Anmeldungssteuerelemente stellen eine abstrakte Ebene für die Formularauthentifizierung bereit und ersparen Ihnen damit viel von dem Aufwand, der sonst mit der Formularauthentifizierung verbunden ist. Weitere Informationen finden Sie unter Verwalten von Benutzern durch Mitgliedschaft und Übersicht über ASP.NET-Anmeldungssteuerelemente. |
In unserem Beispiel fordert der Benutzer eine geschützte Ressource an, eine Seite mit dem Namen Default.aspx. Es gibt nur einen Benutzer mit Zugriff auf die geschützte Ressource: jchen@contoso.com mit dem Kennwort "37Yj*99P". Der Benutzername und das Kennwort sind in der Datei Logon.aspx festgeschrieben. Für das Beispiel werden drei Dateien benötigt: die Datei Web.config, eine Seite mit dem Namen Logon.aspx und eine Seite mit dem Namen Default.aspx. Die Dateien liegen im Stammverzeichnis der Anwendung.
So konfigurieren Sie die Anwendung für die Formularauthentifizierung
Wenn im Stammordner der Anwendung die Datei Web.config bereits vorhanden ist, öffnen Sie sie.
Wenn im Stammordner der Anwendung die Datei Web.config noch nicht vorhanden ist, erstellen Sie eine Textdatei mit dem Namen Web.config, und fügen Sie der Datei die folgenden Elemente hinzu.
<?xml version="1.0"?> <configuration xmlns="https://schemas.microsoft.com/.NetConfiguration/v2.0"> <system.web> </system.web> </configuration>
Erstellen Sie innerhalb des system.web-Elements ein authentication-Element, und legen Sie das mode-Attribut auf Forms fest:
<system.web> <authentication mode="Forms"> </authentication> </system.web>
Erstellen Sie innerhalb des authentication-Elements ein forms-Element, und legen Sie die folgenden Attribute fest:
loginUrl Legen Sie das Attribut auf "Logon.aspx" fest. Logon.aspx ist der Umleitungs-URL für den Fall, dass ASP.NET bei einer Anforderung kein Authentifizierungscookie vorfindet.
name Legen Sie das Attribut auf ".ASPXFORMSAUTH" fest. Legt das Suffix für den Namen des Cookies fest, welches das Authentifizierungsticket enthält.
<system.web> <authentication mode="Forms"> <forms loginUrl="Logon.aspx" name=".ASPXFORMSAUTH"> </forms> </authentication> </system.web>
Erstellen Sie innerhalb des system.web-Elements ein authorization-Element.
<system.web> <authentication mode="Forms"> <forms loginUrl="Logon.aspx" name=".ASPXFORMSAUTH"> </forms> </authentication> <authorization> </authorization> </system.web>
Erstellen Sie innerhalb des authorization-Elements ein deny-Element, und legen Sie sein users-Attribut auf "?" fest. Dadurch wird angegeben, dass nicht authentifizierten Benutzern (dargestellt durch ein "?") der Zugriff auf die Ressourcen dieser Anwendung verweigert wird.
<system.web> <authentication mode="Forms"> <forms loginUrl="logon.aspx" name=".ASPXFORMSAUTH"> </forms> </authentication> <authorization> <deny users="?" /> </authorization> </system.web>
Speichern und schließen Sie die Datei Web.config.
Erstellen der Anmeldeseite
Wenn Benutzer eine beliebige Seite der Website anfordern und zuvor noch nicht authentifiziert wurden, werden sie zu einer Seite mit dem Namen Logon.aspx umgeleitet. Sie haben diesen Dateinamen zu einem früheren Zeitpunkt in der Datei Web.config angegeben.
Die Seite Logon.aspx sammelt Benutzeranmeldeinformationen (E-Mail-Adresse und Kennwort) und authentifiziert die Benutzer. Nachdem der Benutzer erfolgreich authentifiziert wurde, leitet die Anmeldeseite den Benutzer zur ursprünglich angeforderten Seite um. Im Beispiel werden die gültigen Anmeldeinformationen hart codiert in den Seitencode übernommen.
Sicherheitshinweis: |
---|
In diesem Beispiel ist ein Textfeld für eine Benutzereingabe enthalten. Dies stellt ein potenzielles Sicherheitsrisiko dar. Standardmäßig stellt die ASP.NET-Seite sicher, dass die Benutzereingabe keine Skript- oder HTML-Elemente enthält. Weitere Informationen finden Sie unter Übersicht über Skriptangriffe. |
So erstellen Sie die Anmeldeseite
Erstellen Sie eine ASP.NET-Seite mit dem Namen Logon.aspx im Stammordner der Anwendung.
Kopieren Sie das Markup und den Code aus den folgenden Zeilen hinein:
<%@ Page Language="VB" %> <%@ Import Namespace="System.Web.Security" %> <script > Sub Logon_Click(ByVal sender As Object, ByVal e As EventArgs) If ((UserEmail.Text = "jchen@contoso.com") And _ (UserPass.Text = "37Yj*99Ps")) Then FormsAuthentication.RedirectFromLoginPage _ (UserEmail.Text, Persist.Checked) Else Msg.Text = "Invalid credentials. Please try again." End If End Sub </script> <html> <head id="Head1" > <title>Forms Authentication - Login</title> </head> <body> <form id="form1" > <h3> Logon Page</h3> <table> <tr> <td> E-mail address:</td> <td> <asp:TextBox ID="UserEmail" /></td> <td> <asp:RequiredFieldValidator ID="RequiredFieldValidator1" ControlToValidate="UserEmail" Display="Dynamic" ErrorMessage="Cannot be empty." /> </td> </tr> <tr> <td> Password:</td> <td> <asp:TextBox ID="UserPass" TextMode="Password" /> </td> <td> <asp:RequiredFieldValidator ID="RequiredFieldValidator2" ControlToValidate="UserPass" ErrorMessage="Cannot be empty." /> </td> </tr> <tr> <td> Remember me?</td> <td> <asp:CheckBox ID="Persist" /></td> </tr> </table> <asp:Button ID="Submit1" OnClick="Logon_Click" Text="Log On" /> <p> <asp:Label ID="Msg" ForeColor="red" /> </p> </form> </body> </html>
<%@ Page Language="C#" %> <%@ Import Namespace="System.Web.Security" %> <script > void Logon_Click(object sender, EventArgs e) { if ((UserEmail.Text == "jchen@contoso.com") && (UserPass.Text == "37Yj*99Ps")) { FormsAuthentication.RedirectFromLoginPage (UserEmail.Text, Persist.Checked); } else { Msg.Text = "Invalid credentials. Please try again."; } } </script> <html> <head id="Head1" > <title>Forms Authentication - Login</title> </head> <body> <form id="form1" > <h3> Logon Page</h3> <table> <tr> <td> E-mail address:</td> <td> <asp:TextBox ID="UserEmail" /></td> <td> <asp:RequiredFieldValidator ID="RequiredFieldValidator1" ControlToValidate="UserEmail" Display="Dynamic" ErrorMessage="Cannot be empty." /> </td> </tr> <tr> <td> Password:</td> <td> <asp:TextBox ID="UserPass" TextMode="Password" /> </td> <td> <asp:RequiredFieldValidator ID="RequiredFieldValidator2" ControlToValidate="UserPass" ErrorMessage="Cannot be empty." /> </td> </tr> <tr> <td> Remember me?</td> <td> <asp:CheckBox ID="Persist" /></td> </tr> </table> <asp:Button ID="Submit1" OnClick="Logon_Click" Text="Log On" /> <p> <asp:Label ID="Msg" ForeColor="red" /> </p> </form> </body> </html>
Die Seite enthält ASP.NET-Serversteuerelemente, die Benutzerinformationen sammeln, sowie ein Kontrollkästchen, über das die Benutzer die Speicherung ihrer Anmeldeinformationen aktivieren können. Der Click-Handler der Schaltfläche Anmelden enthält Code, der die E-Mail-Adresse und das Kennwort des Benutzers mit hart codierten Werten vergleicht. (Bei dem Kennwort handelt es sich um ein sicheres Kennwort, das verschiedene nicht alphabetische Zeichen enthält und aus mindestens 8 Zeichen zusammengesetzt ist.) Wenn die Anmeldeinformationen korrekt sind, ruft der Code die RedirectFromLoginPage-Methode der FormsAuthentication-Klasse auf. Dabei werden der Benutzername und ein boolescher Wert (abgeleitet vom Kontrollkästchen) zurückgegeben, der angibt, ob ein Authentifizierungsticket als Cookie beibehalten werden soll. Die Methode leitet den Benutzer zur ursprünglich angeforderten Seite um. Wenn die Anmeldeinformationen des Benutzers nicht übereinstimmen, wird eine Fehlermeldung angezeigt. Beachten Sie, dass die Seite den System.Web.Security-Namespace importiert, der die FormsAuthentication-Klasse enthält.
Erstellen der Standardseite
Für das Beispiel müssen Sie eine ASP.NET-Seite im Stammordner der Anwendung erstellen. Da Sie in der Konfigurationsdatei angegeben haben, dass allen nicht authentifizierten Benutzern der Zugriff auf die ASP.NET-Ressourcen der Anwendung (dazu gehören u. a. die ASPX-Dateien, nicht aber statische Dateien, z. B. HTML-Dateien oder Multimedia-Dateien, die Bilder, Musik usw. enthalten) verweigert wird, überprüft die Formularauthentifizierung bei der Seitenanforderung durch den Benutzer die Anmeldeinformationen des Benutzers und leitet ihn, falls erforderlich, auf die Anmeldeseite um. Über die von Ihnen erstellte Seite können sich Benutzer auch abmelden. Damit wird ihr beibehaltenes Authentifizierungsticket (Cookie) gelöscht.
So erstellen Sie eine Standardseite
Erstellen Sie eine ASP.NET-Seite mit dem Namen Default.aspx im Stammordner der Anwendung.
Kopieren Sie das Markup und den Code aus den folgenden Zeilen hinein:
<%@ Page Language="VB" %> <html> <head> <title>Forms Authentication - Default Page</title> </head> <script > Sub Page_Load(ByVal Src As Object, ByVal e As EventArgs) Welcome.Text = "Hello, " & Context.User.Identity.Name End Sub Sub Signout_Click(ByVal sender As Object, ByVal e As EventArgs) FormsAuthentication.SignOut() Response.Redirect("Logon.aspx") End Sub </script> <body> <h3> Using Forms Authentication</h3> <asp:Label ID="Welcome" /> <form id="Form1" > <asp:Button ID="Submit1" OnClick="Signout_Click" Text="Sign Out" /><p> </form> </body> </html>
<%@ Page Language="C#" %> <html> <head> <title>Forms Authentication - Default Page</title> </head> <script > void Page_Load(object sender, EventArgs e) { Welcome.Text = "Hello, " + Context.User.Identity.Name; } void Signout_Click(object sender, EventArgs e) { FormsAuthentication.SignOut(); Response.Redirect("Logon.aspx"); } </script> <body> <h3> Using Forms Authentication</h3> <asp:Label ID="Welcome" /> <form id="Form1" > <asp:Button ID="Submit1" OnClick="Signout_Click" Text="Sign Out" /><p> </form> </body> </html>
Die Seite zeigt die authentifizierte Identität des Benutzers an, die von der FormsAuthentication-Klasse festgelegt wurde und in einer ASP-NET-Seite als Context.User.Identity.Name-Eigenschaft verfügbar ist. Der Click-Handler der Schaltfläche Abmelden enthält Code, der die SignOut-Methode aufruft, um die Benutzeridentität zu löschen und das Authentifizierungsticket (Cookie) zu entfernen. Anschließend wird der Benutzer auf die Anmeldeseite umgeleitet.
Siehe auch
Konzepte
Grundlegende Sicherheitshinweise für Webanwendungen
Referenz
Übersicht über ASP.NET-Anmeldungssteuerelemente