Datei "Logon.aspx"
Anforderungen werden zur Datei Logon.aspx umgeleitet, wenn ASP.NET kein Cookie für die Anforderung vorfindet. Dieser URL wurde in der Konfigurationsdatei eingerichtet. Im folgenden Beispiel wird dem Clientbenutzer ein Formular mit zwei Textfeldern (Email und Password) und einer Senden-Schaltfläche angezeigt. Der Benutzer gibt den E-Mail-Namen und das Kennwort ein und klickt auf die Schaltfläche Senden. Die entsprechende Kombination aus Name und Kennwort wird dann in einer XML-Datei in diesem Verzeichnis gesucht. Wenn sie in der Datei enthalten ist, wird der Benutzer mit Default.aspx verbunden. Andernfalls wird die Datei AddUser.aspx aufgerufen.
So erstellen Sie eine Anmeldedatei für einen Benutzer
Importieren Sie die erforderlichen Namespaces.
<%@ Page LANGUAGE="C#" %> <%@ Import Namespace="System.Data" %> <%@ Import Namespace="System.Data.SqlClient" %> <%@ Import Namespace="System.Web.Security " %> <%@ Import Namespace="System.IO" %> <html> <head> <title>Forms Authentication</title>
Erstellen Sie einen Script-Abschnitt für den Code.
<script runat=server>
Implementieren Sie eine Logon_Click-Funktion.
private void Logon_Click(Object sender, EventArgs e) {
Benachrichtigen Sie den Benutzer, wenn die Seite nicht gültig ist.
if( !Page.IsValid ) { Msg.Text = "Some required fields are invalid."; return; }
Definieren Sie eine Zeichenfolge
cmd
, die mit UserEmail="MyName" initialisiert ist, wobei MyName für den E-Mail-Namen des Benutzers steht. Durch das mit dem Eingabesteuerelement verbundene Überprüfungssteuerelement für reguläre Ausdrücke wurde bereits überprüft, dass der E-Mail-Name ordnungsgemäß formatiert ist und keine ungültigen Zeichen enthält.String cmd = "UserEmail='" + UserEmail.Value + "'";
Erstellen Sie eine neue Instanz der DataSet-Klasse.
DataSet ds = new DataSet();
Lesen Sie die XML-Datei mit den Paaren authentifizierter Benutzernamen und Kennwörter ein. Die abgerufenen Daten befinden sich in
ds
, dem im vorigen Schritt erstellten DataSet.Vorsicht Zur Vereinfachung und um das Beispiel übersichtlicher zu gestalten, folgt der nachstehende Code nicht den Richtlinien für optimalen Sicherheitsverfahren. Er berücksichtigt keine Dateisperren und Dateifreigaben. In einer kommerziellen Website empfiehlt es sich außerdem, relationale Datenbanken oder andere sichere und skalierbare Verfahren für das Speichern der Liste mit authentifizierten Benutzern zu verwenden.
FileStream fs = new FileStream(Server.MapPath("Users.xml"), FileMode.Open,FileAccess.Read); StreamReader reader = new StreamReader(fs); ds.ReadXml(reader); fs.Close();
Erstellen Sie eine neue Instanz einer DataTable namens
users
, die mitds
initialisiert wird.DataTable users = ds.Tables[0];
Suchen Sie nach Übereinstimmungen zwischen den Anmeldenamen und der Namensliste Users.aspx. Erfassen Sie bei jeder Übereinstimmung den Namen in einer DataRow mit der Bezeichnung
matches
.Hinweis Zur Vereinfachung wird in diesem Beispiel jeder Name als eindeutig vorausgesetzt. Daher wird nur die erste Übereinstimmung verwendet.
DataRow[] matches = users.Select(cmd);
Überprüfen Sie für jeden der im vorigen Schritt gefundenen übereinstimmenden Namen, ob ein übereinstimmendes Kennwort vorhanden ist.
if( matches != null && matches.Length > 0 ) {
Wenn eine Überseinstimmung mit einem Benutzernamen gefunden wird, lassen Sie den Hashwert des Benutzerkennworts berechnen und mit dem in der Datei Users.xml gespeicherten Hash vergleichen.
DataRow row = matches[0]; string hashedpwd = FormsAuthentication.HashPasswordForStoringInConfigFile (UserPass.Value, "SHA1"); String pass = (String)row["UserPassword"]; if( 0 != String.Compare(pass, hashedpwd, false) ) // Tell the user if no password match is found. It is good // security practice give no hints about what parts of the // logon credentials are invalid. Msg.Text = "Invalid Credentials: Please try again."; else // If a password match is found, redirect the request // to the originally requested resource (Default.aspx). FormsAuthentication.RedirectFromLoginPage (UserEmail.Value, Persist.Checked); } else { // If no name matches were found, redirect the request to the // AddUser page using a Response.Redirect command. Response.Redirect("AddUser/AddUser.aspx"); } } </script> <body>
Lassen Sie ein Formular für die Eingabe von Anmeldeinformationen anzeigen.
<form runat=server> <span style="background:#80FF80"> <h3><font face="Verdana">Logon Page</font></h3></span> <table> <tr>
Erstellen Sie ein Textfeld e-mail. Fügen Sie ein RequiredFieldValidator-Steuerelement und ein RegularExpressionValidator-Steuerelement hinzu, die die gültige Eingabe des E-Mail-Namens überprüfen. Der RegularExpressionValidator überprüft, ob die E-Mail-Adresse ein gültiges E-Mail-Format hat (z. B. Name@contoso.com) und keine ungültigen Zeichen enthält, die die Sicherheit gefährden können.
<td>e-mail:</td> <td><input id="UserEmail" type="text" runat=server/></td> <td><ASP:RequiredFieldValidator ControlToValidate="UserEmail" Display="Static" ErrorMessage="*" runat="server"/> </td> <td><asp:RegularExpressionValidator id="RegexValidator" ControlToValidate="UserEmail" ValidationExpression="^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$" EnableClientScript="false" Display="Static" ErrorMessage="Invalid format for e-mail address." runat="server"/> </td> </tr> <tr>
Erstellen Sie ein Textfeld Password.
<td>Password:</td> <td><input id="UserPass" type=password runat=server/></td> <td><ASP:RequiredFieldValidator ControlToValidate="UserPass" Display="Static" ErrorMessage="*" runat="server"/> </td> </tr> <tr>
Erstellen Sie ein Kontrollkästchen Persistent Cookies. Wenn das Kontrollkästchen Persistent Cookies aktiviert wird, bleibt das Cookie über die Browsersitzung hinaus gültig. Andernfalls wird das Cookie nach dem Schließen des Browsers zerstört. Die Ausgabe von permanenten Cookies empfiehlt sich bei manchen Sites aus Gründen der Benutzerfreundlichkeit. Permanente Cookies bieten aber einen geringeren Schutz als befristete Cookies.
<td>Persistent Cookies:</td> <td><ASP:CheckBox id=Persist runat="server" autopostback="true"/> </td> <td></td> </tr> </table>
Erstellen Sie eine Senden-Schaltfläche, die bewirkt, dass beim Zurücksenden das Logon_Click-Ereignis ausgelöst wird.
<input type="submit" OnServerClick="Logon_Click" Value="Logon" runat="server"/><p> <asp:Label id="Msg" ForeColor="red" Font-Name="Verdana" Font-Size="10" runat="server"/> </form> </body> </html>
Siehe auch
Sicherheit für ASP.NET-Webanwendungen | Formularauthentifizierung mit Hilfe einer Benutzerdatei im XML-Format