Share via


Überprüfen der Anmeldeinformationen anhand des Mitgliedschaftsbenutzerspeichers (VB)

von Scott Mitchell

Hinweis

Seit diesem Artikel wurden die ASP.NET-Mitgliedschaftsanbieter von ASP.NET Identity abgelöst. Es wird dringend empfohlen, Apps so zu aktualisieren, dass sie die ASP.NET Identity-Plattform anstelle der Mitgliedschaftsanbieter verwenden, die zum Zeitpunkt des Schreibens dieses Artikels vorgestellt wurden. ASP.NET Identity bietet eine Reihe von Vorteilen gegenüber dem ASP.NET Mitgliedschaftssystem, darunter:

  • Bessere Leistung
  • Verbesserte Erweiterbarkeit und Testbarkeit
  • Unterstützung für OAuth, OpenID Connect und zweistufige Authentifizierung
  • Unterstützung der anspruchsbasierten Identität
  • Bessere Interoperabilität mit ASP.Net Core

Code herunterladen oder PDF herunterladen

In diesem Tutorial wird untersucht, wie Sie die Anmeldeinformationen eines Benutzers mithilfe des Programms und des Anmeldesteuerelements für den Mitgliedschaftsbenutzerspeicher überprüfen. Außerdem wird erläutert, wie Sie die Darstellung und das Verhalten des Anmeldesteuerelements anpassen können.

Einführung

Im vorherigen Tutorial haben wir uns mit dem Erstellen eines neuen Benutzerkontos im Mitgliedschaftsframework befasst. Zunächst haben wir uns mit dem programmgesteuerten Erstellen von Benutzerkonten über die -Methode der Membership -Klasse CreateUser befasst und dann mit dem CreateUserWizard-Websteuerelement untersucht. Die Anmeldeseite überprüft derzeit jedoch die angegebenen Anmeldeinformationen anhand einer hartcodierten Liste von Benutzernamen- und Kennwortpaaren. Wir müssen die Logik der Anmeldeseite aktualisieren, damit anmeldeinformationen für den Benutzerspeicher des Mitgliedschaftsframeworks überprüft werden.

Ähnlich wie beim Erstellen von Benutzerkonten können Anmeldeinformationen programmgesteuert oder deklarativ überprüft werden. Die Mitgliedschafts-API enthält eine Methode zum programmgesteuerten Überprüfen der Anmeldeinformationen eines Benutzers für den Benutzerspeicher. Und ASP.NET mit dem Login Web-Steuerelement ausgeliefert, das eine Benutzeroberfläche mit Textfeldern für Benutzername und Kennwort sowie eine Schaltfläche zum Anmelden rendert.

In diesem Tutorial wird untersucht, wie Sie die Anmeldeinformationen eines Benutzers mithilfe des Programms und des Anmeldesteuerelements für den Mitgliedschaftsbenutzerspeicher überprüfen. Außerdem wird erläutert, wie Sie die Darstellung und das Verhalten des Anmeldesteuerelements anpassen können. Jetzt geht‘s los!

Schritt 1: Überprüfen der Anmeldeinformationen für den Mitgliedschaftsbenutzerspeicher

Bei Websites, die die Formularauthentifizierung verwenden, meldet sich ein Benutzer bei der Website an, indem er eine Anmeldeseite besucht und seine Anmeldeinformationen eingibt. Diese Anmeldeinformationen werden dann mit dem Benutzerspeicher verglichen. Wenn sie gültig sind, erhält der Benutzer ein Formularauthentifizierungsticket, bei dem es sich um ein Sicherheitstoken handelt, das die Identität und Authentizität des Besuchers angibt.

Um einen Benutzer anhand des Membership-Frameworks zu überprüfen, verwenden Sie die -Methode derValidateUserMembership -Klasse. Die ValidateUser Methode akzeptiert zwei Eingabeparameter - username und password - und und gibt einen booleschen Wert zurück, der angibt, ob die Anmeldeinformationen gültig waren. Wie bei der Methode, die CreateUser wir im vorherigen Tutorial untersucht haben, delegiert die ValidateUser Methode die tatsächliche Überprüfung an den konfigurierten Mitgliedschaftsanbieter.

Die SqlMembershipProvider überprüft die angegebenen Anmeldeinformationen, indem das Kennwort des angegebenen Benutzers über die aspnet_Membership_GetPasswordWithFormat gespeicherte Prozedur abgerufen wird. Denken Sie daran, dass die Kennwörter der SqlMembershipProvider Benutzer in einem von drei Formaten gespeichert werden: klar, verschlüsselt oder hashed. Die aspnet_Membership_GetPasswordWithFormat gespeicherte Prozedur gibt das Kennwort im Rohformat zurück. Bei verschlüsselten oder gehashten Kennwörtern transformiert der SqlMembershipProvider an die password -Methode übergebene Wert in den ValidateUser entsprechenden verschlüsselten oder hashed Zustand und vergleicht ihn dann mit dem, was aus der Datenbank zurückgegeben wurde. Wenn das in der Datenbank gespeicherte Kennwort mit dem vom Benutzer eingegebenen formatierten Kennwort übereinstimmt, sind die Anmeldeinformationen gültig.

Aktualisieren wir unsere Anmeldeseite (~/Login.aspx), sodass die angegebenen Anmeldeinformationen für den Benutzerspeicher des Membership Framework überprüft werden. Wir haben diese Anmeldeseite im Tutorial Eine Übersicht über die Formularauthentifizierung erstellt und dabei eine Schnittstelle mit zwei TextBoxes für Benutzername und Kennwort, einem Kontrollkästchen "Mich merken" und einer Schaltfläche "Anmeldung" erstellt (siehe Abbildung 1). Der Code überprüft die eingegebenen Anmeldeinformationen anhand einer hartcodierten Liste von Benutzernamen- und Kennwortpaaren (Scott/Password, Jisun/password und Sam/kennwort).

Die Schnittstelle der Anmeldeseite enthält zwei Textfelder, eine CheckBoxList und eine Schaltfläche.

Abbildung 1: Die Benutzeroberfläche der Anmeldeseite enthält zwei Textfelder, eine CheckBoxList und eine Schaltfläche (klicken, um das bild in voller Größe anzuzeigen)

Die Benutzeroberfläche der Anmeldeseite kann unverändert bleiben, aber wir müssen den Ereignishandler der Anmeldeschaltfläche Click durch Code ersetzen, der den Benutzer anhand des Benutzerspeichers für das Mitgliedschaftsframework überprüft. Aktualisieren Sie den Ereignishandler, sodass sein Code wie folgt angezeigt wird:

Protected Sub LoginButton_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles LoginButton.Click

 ' Validate the user against the Membership framework user store
 If Membership.ValidateUser(UserName.Text, Password.Text) Then
 ' Log the user into the site
 FormsAuthentication.RedirectFromLoginPage(UserName.Text, RememberMe.Checked)
 End If
    
 ' If we reach here, the user's credentials were invalid
 InvalidCredentialsMessage.Visible = True
End Sub

Dieser Code ist bemerkenswert einfach. Zunächst rufen wir die Membership.ValidateUser -Methode auf und übergeben den angegebenen Benutzernamen und das angegebene Kennwort. Wenn diese Methode True zurückgibt, wird der Benutzer über die RedirectFromLoginPage-Methode der Klasse bei der FormsAuthentication Website angemeldet. (Wie in der Ein Tutorial zur Übersicht über die Formularauthentifizierung erstellt FormsAuthentication.RedirectFromLoginPage das Formularauthentifizierungsticket und leitet den Benutzer dann zur entsprechenden Seite um.) Wenn die Anmeldeinformationen jedoch ungültig sind, wird die InvalidCredentialsMessage Bezeichnung angezeigt, die den Benutzer darüber informiert, dass sein Benutzername oder sein Kennwort falsch war.

Das war es schon!

Um zu testen, dass die Anmeldeseite wie erwartet funktioniert, versuchen Sie, sich mit einem der Benutzerkonten anzumelden, die Sie im vorherigen Tutorial erstellt haben. Wenn Sie noch kein Konto erstellt haben, erstellen Sie ein Konto auf der ~/Membership/CreatingUserAccounts.aspx Seite.

Hinweis

Wenn der Benutzer seine Anmeldeinformationen eingibt und das Formular für die Anmeldeseite übermittelt, werden die Anmeldeinformationen, einschließlich des Kennworts, im Nur-Text-Format über das Internet an den Webserver übertragen. Das bedeutet, dass jeder Hacker, der den Netzwerkdatenverkehr erschnüffelt, den Benutzernamen und das Kennwort sehen kann. Um dies zu verhindern, ist es wichtig, den Netzwerkdatenverkehr mithilfe von SSL (Secure Socket Layer) zu verschlüsseln. Dadurch wird sichergestellt, dass die Anmeldeinformationen (sowie das HTML-Markup der gesamten Seite) ab dem Zeitpunkt verschlüsselt werden, an dem sie den Browser verlassen, bis sie vom Webserver empfangen werden.

So behandelt das Mitgliedschaftsframework ungültige Anmeldeversuche

Wenn ein Besucher die Anmeldeseite erreicht und seine Anmeldeinformationen übermittelt, sendet sein Browser eine HTTP-Anforderung an die Anmeldeseite. Wenn die Anmeldeinformationen gültig sind, enthält die HTTP-Antwort das Authentifizierungsticket in einem Cookie. Daher könnte ein Hacker, der versucht, in Ihre Website einzubrechen, ein Programm erstellen, das http-Anforderungen vollständig an die Anmeldeseite mit einem gültigen Benutzernamen und einer Vermutung über das Kennwort sendet. Wenn die Kennwortschätzung richtig ist, gibt die Anmeldeseite das Cookie für das Authentifizierungsticket zurück. An diesem Punkt weiß das Programm, dass es auf ein gültiges Benutzername/Kennwort-Paar gestoßen ist. Durch Brute Force kann ein solches Programm auf das Kennwort eines Benutzers stoßen, insbesondere wenn das Kennwort schwach ist.

Um solche Brute-Force-Angriffe zu verhindern, sperrt das Membership-Framework einen Benutzer aus, wenn innerhalb eines bestimmten Zeitraums eine bestimmte Anzahl von fehlgeschlagenen Anmeldeversuchen vorhanden ist. Die genauen Parameter können über die folgenden beiden Konfigurationseinstellungen des Mitgliedschaftsanbieters konfiguriert werden:

  • maxInvalidPasswordAttempts – gibt an, wie viele ungültige Kennwortversuche für den Benutzer innerhalb des Zeitraums zulässig sind, bevor das Konto gesperrt wird. Der Standardwert ist 5.
  • passwordAttemptWindow – gibt den Zeitraum in Minuten an, in dem die angegebene Anzahl ungültiger Anmeldeversuche dazu führt, dass das Konto gesperrt wird. Der Standardwert ist 10.

Wenn ein Benutzer gesperrt wurde, kann er sich erst anmelden, wenn ein Administrator sein Konto entsperrt. Wenn ein Benutzer gesperrt ist, gibt die ValidateUser Methode immer zurück False, auch wenn gültige Anmeldeinformationen angegeben werden. Dieses Verhalten verringert zwar die Wahrscheinlichkeit, dass ein Hacker durch Brute-Force-Methoden in Ihre Website einbricht, kann jedoch letztendlich einen gültigen Benutzer sperren, der einfach sein Kennwort vergessen hat oder versehentlich die Caps-Sperre aktiviert hat oder einen schlechten Tipptag hat.

Leider gibt es kein integriertes Tool zum Entsperren eines Benutzerkontos. Um ein Konto zu entsperren, können Sie die Datenbank direkt ändern - das IsLockedOut Feld in der Tabelle für das aspnet_Membership entsprechende Benutzerkonto ändern - oder eine webbasierte Schnittstelle erstellen, die gesperrte Konten mit Optionen zum Entsperren auflistet. In einem zukünftigen Tutorial werden wir das Erstellen von Verwaltungsschnittstellen zum Ausführen allgemeiner Aufgaben im Zusammenhang mit Benutzerkonten und Rollen untersuchen.

Hinweis

Ein Nachteil der ValidateUser Methode ist, dass sie keine Erklärung dafür liefert, wenn die angegebenen Anmeldeinformationen ungültig sind. Die Anmeldeinformationen sind möglicherweise ungültig, weil kein übereinstimmende Benutzernamen/Kennwort-Paar im Benutzerspeicher vorhanden ist, oder weil der Benutzer noch nicht genehmigt wurde oder weil der Benutzer gesperrt wurde. In Schritt 4 erfahren Sie, wie Sie dem Benutzer eine ausführlichere Nachricht anzeigen, wenn der Anmeldeversuch fehlschlägt.

Schritt 2: Sammeln von Anmeldeinformationen über das Anmeldewebsteuerelement

Das Websteuerelement Anmeldung rendert eine Standardbenutzerschnittstelle, die der im Tutorial Eine Übersicht über die Formularauthentifizierung erstellt wurde. Die Verwendung des Login-Steuerelements erspart uns die Erstellung der Schnittstelle zum Erfassen der Anmeldeinformationen des Besuchers. Darüber hinaus meldet sich das Login-Steuerelement automatisch beim Benutzer an (vorausgesetzt, die übermittelten Anmeldeinformationen sind gültig), wodurch wir keinen Code schreiben müssen.

Login.aspxAktualisieren sie, indem Sie die manuell erstellte Schnittstelle und den Code durch ein Anmeldesteuerelement ersetzen. Entfernen Sie zunächst das vorhandene Markup und den code in Login.aspx. Sie können es direkt löschen oder einfach auskommentieren. Um deklaratives Markup auszukommentieren, umgeben Sie es mit den <%-- Trennzeichen und --%> . Sie können diese Trennzeichen manuell eingeben, oder Sie können, wie Abbildung 2 zeigt, den auszukommenden Text auswählen und dann auf das Symbol Auskommentieren der ausgewählten Zeilen in der Symbolleiste klicken. Auf ähnliche Weise können Sie das Symbol Auskommentieren der ausgewählten Zeilen verwenden, um den ausgewählten Code in der CodeBehind-Klasse auszukommentieren.

Auskommentieren des vorhandenen deklarativen Markups und des Quellcodes in Login.aspx

Abbildung 2: Auskommentieren des vorhandenen deklarativen Markups und des Quellcodes in Login.aspx (Klicken Sie hier, um das vollständige Bild anzuzeigen)

Hinweis

Das Symbol Auskommentieren der ausgewählten Zeilen ist beim Anzeigen des deklarativen Markups in Visual Studio 2005 nicht verfügbar. Wenn Sie Visual Studio 2008 nicht verwenden, müssen Sie die <%-- Trennzeichen und --%> manuell hinzufügen.

Ziehen Sie als Nächstes ein Login-Steuerelement aus der Toolbox auf die Seite, und legen Sie seine ID Eigenschaft auf fest myLogin. An diesem Punkt sollte Ihr Bildschirm ähnlich wie Abbildung 3 aussehen. Beachten Sie, dass die Standardschnittstelle des Anmeldesteuerelements TextBox-Steuerelemente für den Benutzernamen und das Kennwort, ein CheckBox-Element zum nächsten Mal merken und eine Schaltfläche "Anmelden" enthält. Es gibt auch RequiredFieldValidator Steuerelemente für die beiden TextBoxes.

Hinzufügen eines Anmeldesteuerelements zur Seite

Abbildung 3: Hinzufügen eines Anmeldesteuerelements zur Seite (Klicken Sie hier, um das Bild in voller Größe anzuzeigen)

Fertig! Wenn auf die Schaltfläche Anmelden des Anmeldesteuerelements geklickt wird, erfolgt ein Postback, und das Login-Steuerelement ruft die Membership.ValidateUser Methode auf, wobei der eingegebene Benutzername und das eingegebene Kennwort übergeben werden. Wenn die Anmeldeinformationen ungültig sind, zeigt das Anmeldesteuerelement eine Entsprechende Meldung an. Wenn die Anmeldeinformationen jedoch gültig sind, erstellt das Anmeldesteuerelement das Formularauthentifizierungsticket und leitet den Benutzer zur entsprechenden Seite um.

Das Login-Steuerelement verwendet vier Faktoren, um die geeignete Seite zu bestimmen, zu der der Benutzer bei einer erfolgreichen Anmeldung umgeleitet werden soll:

  • Gibt an, ob sich das Anmeldesteuerelement auf der Anmeldeseite befindet, wie durch loginUrl Festlegen in der Formularauthentifizierungskonfiguration definiert. Der Standardwert dieser Einstellung ist Login.aspx
  • Das Vorhandensein eines ReturnUrl querystring-Parameters
  • Der Wert der Eigenschaft des Login-Steuerelements DestinationUrl
  • Der defaultUrl in den Konfigurationseinstellungen für die Formularauthentifizierung angegebene Wert. Der Standardwert dieser Einstellung ist Default.aspx.

Abbildung 4 zeigt, wie das Login-Steuerelement diese vier Parameter verwendet, um die entsprechende Seitenentscheidung zu treffen.

Das Login-Steuerelement verwendet vier Parameter, um die entsprechende Seitenentscheidung zu treffen.

Abbildung 4: Hinzufügen eines Anmeldesteuerelements zur Seite (Klicken Sie hier, um das Bild in voller Größe anzuzeigen)

Nehmen Sie sich einen Moment Zeit, um das Anmeldesteuerelement zu testen, indem Sie die Website über einen Browser besuchen und sich als vorhandener Benutzer im Mitgliedschaftsframework anmelden.

Die gerenderte Schnittstelle des Anmeldesteuerelements ist in hohem Maße konfigurierbar. Es gibt eine Reihe von Eigenschaften, die das Aussehen beeinflussen; Darüber hinaus kann das Login-Steuerelement in eine Vorlage konvertiert werden, um das Layout der Benutzeroberflächenelemente präzise zu steuern. Im weiteren Verlauf dieses Schritts wird untersucht, wie Sie die Darstellung und das Layout anpassen.

Anpassen der Darstellung des Anmeldesteuerelements

Die Standardeigenschafteneinstellungen des Login-Steuerelements rendern eine Benutzeroberfläche mit einem Titel ( Anmelden ), TextBox- und Label-Steuerelementen für die Benutzernamen- und Kennworteingaben, ein CheckBox-Element für das nächste Mal speichern und eine Schaltfläche Anmelden. Die Darstellungen dieser Elemente können alle über die zahlreichen Eigenschaften des Login-Steuerelements konfiguriert werden. Darüber hinaus können zusätzliche Benutzeroberflächenelemente hinzugefügt werden, z. B. ein Link zu einer Seite, um ein neues Benutzerkonto zu erstellen, indem sie ein oder zwei Eigenschaften festlegen.

Lassen Sie uns einen Moment damit verbringen, das Erscheinungsbild unseres Anmeldesteuerelements zu verinnen. Da die Login.aspx Seite oben auf der Seite bereits Text enthält, der anmeldet, ist der Titel des Login-Steuerelements überflüssig. Löschen Sie daher den TitleText Eigenschaftswert , um den Titel des Anmeldesteuerelements zu entfernen.

Die Bezeichnungen Benutzername: und Kennwort: links von den beiden TextBox-Steuerelementen können über die UserNameLabelText Eigenschaften und PasswordLabelTextangepasst werden. Ändern Wir den Benutzernamen: Bezeichnung so, dass Benutzername: gelesen wird. Die Formatvorlagen Label und TextBox können über die LabelStyle Eigenschaften und TextBoxStylekonfiguriert werden.

Die Text-Eigenschaft von CheckBox kann über die -Eigenschaft desRememberMeText Login-Steuerelements festgelegt werden, und deren standardmäßig aktivierter Zustand ist über die RememberMeSet -Eigenschaft konfigurierbar (standardmäßig false). Fahren Sie fort, und legen Sie die RememberMeSet Eigenschaft auf True fest, damit checkBox beim nächsten Mal speichern standardmäßig aktiviert wird.

Das Login-Steuerelement bietet zwei Eigenschaften zum Anpassen des Layouts seiner Benutzeroberflächensteuerelemente. Die TextLayout -Eigenschaft gibt an, ob die Bezeichnungen Benutzername: und Kennwort: links neben den entsprechenden TextBoxes (Standard) oder darüber angezeigt werden. Die Orientation -Eigenschaft gibt an, ob die Benutzernamen- und Kennworteingaben vertikal (übereinander) oder horizontal angeordnet sind. Ich werde diese beiden Eigenschaften auf ihre Standardwerte festlegen, aber ich ermutige Sie, zu versuchen, diese beiden Eigenschaften auf ihre Nicht-Standardwerte festzulegen, um den resultierenden Effekt zu sehen.

Hinweis

Im nächsten Abschnitt, Konfigurieren des Layouts des Anmeldesteuerelements, sehen wir uns die Verwendung von Vorlagen an, um das genaue Layout der Benutzeroberflächenelemente des Layout-Steuerelements zu definieren.

Schließen Sie die Eigenschafteneinstellungen des Anmeldesteuerelements ab, indem Sie die CreateUserText Eigenschaften und CreateUserUrl auf Noch nicht registriert? festlegen. Erstellen Sie ein Konto! und ~/Membership/CreatingUserAccounts.aspx, bzw. Dadurch wird ein Link zur Schnittstelle des Anmeldesteuerelements hinzugefügt, der auf die Seite verweist, die wir im vorherigen Tutorial erstellt haben. Die Eigenschaften und HelpPageUrl eigenschaften des Anmeldesteuerelements HelpPageText und PasswordRecoveryText und PasswordRecoveryUrl funktionieren auf die gleiche Weise, sodass Links zu einer Hilfeseite und einer Kennwortwiederherstellungsseite gerendert werden.

Nachdem Sie diese Eigenschaftsänderungen vorgenommen haben, sollten das deklarative Markup und die Darstellung Ihres Anmeldesteuerelements in etwa wie in Abbildung 5 dargestellt aussehen.

Die Eigenschaftenwerte des Anmeldesteuerelements diktieren seine Darstellung.

Abbildung 5: Die Werte der Eigenschaften des Anmeldesteuerelements diktieren seine Darstellung (Klicken Sie hier, um das Bild in voller Größe anzuzeigen)

Konfigurieren des Layouts des Anmeldesteuerelements

Die Standard-Benutzeroberfläche des Anmeldewebsteuerelements legt die Benutzeroberfläche in einem HTML-Code <table>dar. Aber was, wenn wir eine genauere Kontrolle über die gerenderte Ausgabe benötigen? Vielleicht möchten wir das <table> durch eine Reihe von <div> Tags ersetzen. Oder was geschieht, wenn für unsere Anwendung zusätzliche Anmeldeinformationen für die Authentifizierung erforderlich sind? Viele Finanzwebsites für instance erfordern, dass Benutzer nicht nur einen Benutzernamen und ein Kennwort, sondern auch eine persönliche Identifikationsnummer (PIN) oder andere identifizierende Informationen angeben. Unabhängig von den Gründen ist es möglich, das Login-Steuerelement in eine Vorlage zu konvertieren, aus der wir explizit das deklarative Markup der Schnittstelle definieren können.

Wir müssen zwei Dinge tun, um das Anmeldesteuerelement zu aktualisieren, um zusätzliche Anmeldeinformationen zu sammeln:

  1. Aktualisieren Sie die Schnittstelle des Anmeldesteuerelements, um Websteuerelemente zum Sammeln der zusätzlichen Anmeldeinformationen einzuschließen.
  2. Überschreiben Sie die interne Authentifizierungslogik des Anmeldesteuerelements, sodass ein Benutzer nur authentifiziert wird, wenn der Benutzername und das Kennwort gültig sind und die zusätzlichen Anmeldeinformationen ebenfalls gültig sind.

Zum Ausführen der ersten Aufgabe müssen wir das Anmeldesteuerelement in eine Vorlage konvertieren und die erforderlichen Websteuerelemente hinzufügen. Bei der zweiten Aufgabe kann die Authentifizierungslogik des Anmeldesteuerelements abgelöst werden, indem ein Ereignishandler für das Ereignis des Steuerelements Authenticateerstellt wird.

Aktualisieren Wir nun das Anmeldesteuerelement, sodass Benutzer zur Eingabe ihres Benutzernamens, Kennworts und ihrer E-Mail-Adresse aufgefordert werden und der Benutzer nur authentifiziert wird, wenn die angegebene E-Mail-Adresse mit der E-Mail-Adresse in der Datei übereinstimmt. Wir müssen zuerst die Schnittstelle des Anmeldesteuerelements in eine Vorlage konvertieren. Wählen Sie im Smarttag des Anmeldesteuerelements die Option In Vorlage konvertieren aus.

Konvertieren des Anmeldesteuerelements in eine Vorlage

Abbildung 6: Konvertieren des Anmeldesteuerelements in eine Vorlage (Klicken Sie hier, um das Bild in voller Größe anzuzeigen)

Hinweis

Klicken Sie im Smarttag des Steuerelements auf den Link Zurücksetzen, um das Anmeldesteuerelement auf seine Vorgängerversion zu rückgängig machen.

Beim Konvertieren des Anmeldesteuerelements in eine Vorlage wird dem deklarativen Markup des Steuerelements ein LayoutTemplate hinzugefügt, wobei HTML-Elemente und Websteuerelemente die Benutzeroberfläche definieren. Wie abbildung 7 zeigt, werden beim Konvertieren des Steuerelements in eine Vorlage eine Reihe von Eigenschaften aus dem Eigenschaftenfenster entfernt, zTitleText. B. , CreateUserUrlusw., da diese Eigenschaftswerte bei der Verwendung einer Vorlage ignoriert werden.

Weniger Eigenschaften sind verfügbar, wenn das Anmeldesteuerelement in eine Vorlage konvertiert wird.

Abbildung 7: Weniger Eigenschaften sind verfügbar, wenn das Anmeldesteuerelement in eine Vorlage konvertiert wird (Klicken Sie hier, um das Bild in voller Größe anzuzeigen)

Das HTML-Markup im LayoutTemplate kann bei Bedarf geändert werden. Ebenso können Sie der Vorlage alle neuen Websteuerelemente hinzufügen. Es ist jedoch wichtig, dass die wichtigsten Websteuerelemente des Anmeldesteuerelements in der Vorlage verbleiben und die zugewiesenen ID Werte beibehalten werden. Entfernen oder benennen Sie insbesondere die UserName Textfelder oder Password das CheckBox-Steuerelement, RememberMe die LoginButton Schaltfläche, die FailureText Bezeichnung oder die RequiredFieldValidator Steuerelemente nicht um.

Um die E-Mail-Adresse des Besuchers zu erfassen, müssen wir der Vorlage ein TextBox-Element hinzufügen. Fügen Sie das folgende deklarative Markup zwischen der Tabellenzeile (<tr>), die das Password TextBox-Element enthält, und der Tabellenzeile hinzu, die das CheckBox-Element "Beim nächsten Mal speichern" enthält:

<tr>
 <td align="right">
 <asp:Label ID="EmailLabel" runat="server" AssociatedControlID="Email">Email:</asp:Label>
 </td>
 <td>
 <asp:TextBox ID="Email" runat="server"></asp:TextBox>
 <asp:RequiredFieldValidator ID="EmailRequired" runat="server"
 ControlToValidate="Email" ErrorMessage="Email is required."
 ToolTip="Email is required." ValidationGroup="myLogin">*</asp:RequiredFieldValidator>
 </td>
</tr>

Nachdem Sie textBox Email hinzugefügt haben, besuchen Sie die Seite über einen Browser. Wie abbildung 8 zeigt, enthält die Benutzeroberfläche des Anmeldesteuerelements jetzt ein drittes Textfeld.

Das Anmeldesteuerelement enthält jetzt ein Textfeld für die Email Adresse des Benutzers.

Abbildung 8: Das Anmeldesteuerelement enthält jetzt ein Textfeld für die Email Adresse des Benutzers (Klicken Sie hier, um das Bild in voller Größe anzuzeigen)

An diesem Punkt verwendet das Login-Steuerelement weiterhin die Membership.ValidateUser -Methode, um die angegebenen Anmeldeinformationen zu überprüfen. Entsprechend hat der in textBox Email eingegebene Wert keinen Einfluss darauf, ob sich der Benutzer anmelden kann. In Schritt 3 wird erläutert, wie die Authentifizierungslogik des Anmeldesteuerelements außer Kraft gesetzt wird, sodass die Anmeldeinformationen nur dann als gültig betrachtet werden, wenn Benutzername und Kennwort gültig sind und die angegebene E-Mail-Adresse mit der in der Datei gespeicherten E-Mail-Adresse übereinstimmt.

Schritt 3: Ändern der Authentifizierungslogik des Anmeldesteuerelements

Wenn ein Besucher seine Anmeldeinformationen bereitstellt und auf die Schaltfläche Anmelden klickt, wird ein Postback ausgeführt, und das Anmeldesteuerelement durchläuft den Authentifizierungsworkflow. Der Workflow beginnt mit dem Auslösen des -EreignissesLoggingIn. Alle diesem Ereignis zugeordneten Ereignishandler können den Anmeldevorgang abbrechen, indem sie die e.Cancel -Eigenschaft auf Truefestlegen.

Wenn der Anmeldevorgang nicht abgebrochen wird, wird der Workflow fortgesetzt, indem das Authenticate -Ereignis ausgelöst wird. Wenn ein Ereignishandler für das Authenticate Ereignis vorhanden ist, ist dieser dafür verantwortlich, zu bestimmen, ob die angegebenen Anmeldeinformationen gültig sind oder nicht. Wenn kein Ereignishandler angegeben ist, verwendet das Login-Steuerelement die Membership.ValidateUser -Methode, um die Gültigkeit der Anmeldeinformationen zu bestimmen.

Wenn die angegebenen Anmeldeinformationen gültig sind, wird das Formularauthentifizierungsticket erstellt, das LoggedIn Ereignis ausgelöst, und der Benutzer wird zur entsprechenden Seite umgeleitet. Wenn die Anmeldeinformationen jedoch als ungültig eingestuft werden, wird das LoginError Ereignis ausgelöst, und es wird eine Meldung angezeigt, die den Benutzer darüber informiert, dass seine Anmeldeinformationen ungültig waren. Standardmäßig legt das Login-Steuerelement bei einem Fehler einfach die Text-Eigenschaft des FailureText Label-Steuerelements auf eine Fehlermeldung fest ( Ihr Anmeldeversuch war nicht erfolgreich. Versuchen Sie es erneut. Wenn die Eigenschaft des FailureAction Login-Steuerelements jedoch auf RedirectToLoginPagefestgelegt ist, gibt das Login-Steuerelement eine an die Anmeldeseite ausResponse.Redirect, die den Querystring-Parameter loginfailure=1 anfügen (wodurch das Login-Steuerelement die Fehlermeldung anzeigt).

Abbildung 9 enthält ein Flussdiagramm des Authentifizierungsworkflows.

Der Authentifizierungsworkflow des Anmeldesteuerelements

Abbildung 9: Authentifizierungsworkflow des Anmeldesteuerelements (Klicken Sie hier, um das Bild in voller Größe anzuzeigen)

Hinweis

Wenn Sie sich fragen, wann Sie die FailureActionOption 's RedirectToLogin Seite verwenden würden, betrachten Sie das folgende Szenario. Im Moment enthält unsere Site.master master Seite derzeit den Text Hello, stranger in der linken Spalte angezeigt, wenn er von einem anonymen Benutzer besucht wird, aber stellen Sie sich vor, dass wir diesen Text durch ein Login-Steuerelement ersetzen möchten. Dies würde es einem anonymen Benutzer ermöglichen, sich von einer beliebigen Seite auf der Website anzumelden, anstatt dass er die Anmeldeseite direkt besuchen muss. Wenn sich ein Benutzer jedoch nicht über das von der master-Seite gerenderte Anmeldesteuerelement anmelden konnte, kann es sinnvoll sein, ihn zur Anmeldeseite (Login.aspx) umzuleiten, da diese Seite wahrscheinlich zusätzliche Anweisungen, Links und andere Hilfe enthält, z. B. Links zum Erstellen eines neuen Kontos oder abrufen eines verlorenen Kennworts, die der master Seite nicht hinzugefügt wurden.

Erstellen desAuthenticateEreignishandlers

Um unsere benutzerdefinierte Authentifizierungslogik zu verbinden, müssen wir einen Ereignishandler für das Ereignis des Anmeldesteuerelements Authenticate erstellen. Beim Erstellen eines Ereignishandlers für das Authenticate Ereignis wird die folgende Ereignishandlerdefinition generiert:

Protected Sub myLogin_Authenticate(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.AuthenticateEventArgs) Handles myLogin.Authenticate

End Sub

Wie Sie sehen können, wird dem Authenticate Ereignishandler ein Objekt vom Typ AuthenticateEventArgs als zweiter Eingabeparameter übergeben. Die AuthenticateEventArgs -Klasse enthält eine boolesche Eigenschaft namens Authenticated , die verwendet wird, um anzugeben, ob die angegebenen Anmeldeinformationen gültig sind. Unsere Aufgabe besteht dann darin, hier Code zu schreiben, der bestimmt, ob die angegebenen Anmeldeinformationen gültig sind oder nicht, und die e.Authenticate Eigenschaft entsprechend festzulegen.

Ermitteln und Überprüfen der angegebenen Anmeldeinformationen

Verwenden Sie die Eigenschaften und Password Eigenschaften des AnmeldesteuerelementsUserName, um die vom Benutzer eingegebenen Anmeldeinformationen für Benutzername und Kennwort zu ermitteln. Um die Werte zu bestimmen, die in zusätzliche Websteuerelemente eingegeben werden (z. B. das TextBox, das Email wir im vorherigen Schritt hinzugefügt haben), verwenden Sie LoginControlID.FindControl("controlID"), um einen programmgesteuerten Verweis auf das Websteuerelement in der Vorlage abzurufencontrolID, dessen ID Eigenschaft gleich ist. Verwenden Sie beispielsweise den folgenden Code, um einen Verweis auf das Email Textfeld abzurufen:

Dim EmailTextBox As TextBox = CType(myLogin.FindControl("Email"), TextBox)

Um die Anmeldeinformationen des Benutzers zu überprüfen, müssen wir zwei Dinge tun:

  1. Stellen Sie sicher, dass der angegebene Benutzername und das angegebene Kennwort gültig sind.
  2. Stellen Sie sicher, dass die eingegebene E-Mail-Adresse mit der E-Mail-Adresse in der Datei für den Benutzer übereinstimmt, der versucht, sich anzumelden.

Um die erste Überprüfung durchzuführen, können wir einfach die Membership.ValidateUser -Methode wie in Schritt 1 verwenden. Für die zweite Überprüfung müssen wir die E-Mail-Adresse des Benutzers ermitteln, damit wir sie mit der E-Mail-Adresse vergleichen können, die er in das TextBox-Steuerelement eingegeben hat. Um Informationen zu einem bestimmten Benutzer abzurufen, verwenden Sie die -Methode derGetUserMembership -Klasse.

Die GetUser Methode weist eine Reihe von Überladungen auf. Wenn sie ohne Übergabe von Parametern verwendet wird, werden Informationen zum aktuell angemeldeten Benutzer zurückgegeben. Um Informationen zu einem bestimmten Benutzer zu erhalten, rufen Sie GetUser den Benutzernamen an. In beiden Richtungen GetUser wird ein MembershipUser -Objekt zurückgegeben, das Über Eigenschaften wie UserName, , EmailIsApproved, IsOnlineusw. verfügt.

Der folgende Code implementiert diese beiden Überprüfungen. Wenn beide übergeben, ist auf e.AuthenticateTruefestgelegt, andernfalls wird ihm zugewiesen False.

Protected Sub myLogin_Authenticate(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.AuthenticateEventArgs) Handles myLogin.Authenticate
    
 ' Get the email address entered
 Dim EmailTextBox As TextBox = CType(myLogin.FindControl("Email"), TextBox)
 Dim email As String = EmailTextBox.Text.Trim()
    
 ' Verify that the username/password pair is valid
 If Membership.ValidateUser(myLogin.UserName, myLogin.Password) Then

 ' Username/password are valid, check email
 Dim usrInfo As MembershipUser = Membership.GetUser(myLogin.UserName)
    
 If usrInfo IsNot Nothing AndAlso String.Compare(usrInfo.Email, email, True) = 0 Then
 ' Email matches, the credentials are valid
 e.Authenticated = True
 Else
 ' Email address is invalid...
 e.Authenticated = False
 End If
 Else
 ' Username/password are not valid...
 e.Authenticated = False
 End If
End Sub

Wenn dieser Code vorhanden ist, versuchen Sie, sich als gültiger Benutzer anzumelden, und geben Sie den richtigen Benutzernamen, das richtige Kennwort und die richtige E-Mail-Adresse ein. Versuchen Sie es erneut, aber verwenden Sie diesmal absichtlich eine falsche E-Mail-Adresse (siehe Abbildung 10). Probieren Sie es schließlich ein drittes Mal mit einem nicht vorhandenen Benutzernamen aus. Im ersten Fall sollten Sie erfolgreich bei der Website angemeldet sein, aber in den letzten beiden Fällen sollte die Meldung ungültige Anmeldeinformationen des Anmeldesteuerelements angezeigt werden.

Tito kann sich nicht anmelden, wenn eine falsche Email Adresse angegeben wird

Abbildung 10: Tito kann sich nicht anmelden, wenn eine falsche Email Adresse angegeben wird (Klicken Sie, um das Bild in voller Größe anzuzeigen)

Hinweis

Wie im Abschnitt Umgang mit ungültigen Anmeldeversuchen durch das Mitgliedschaftsframework in Schritt 1 erläutert, verfolgt sie den ungültigen Anmeldeversuch, wenn die Membership.ValidateUser Methode aufgerufen und ungültige Anmeldeinformationen übergeben wird, und sperrt den Benutzer aus, wenn er einen bestimmten Schwellenwert für ungültige Versuche innerhalb eines angegebenen Zeitfensters überschreitet. Da unsere benutzerdefinierte Authentifizierungslogik die ValidateUser Methode aufruft, erhöht ein falsches Kennwort für einen gültigen Benutzernamen den Zähler für ungültige Anmeldeversuche. Dieser Indikator wird jedoch nicht inkrementiert, wenn Benutzername und Kennwort gültig sind, aber die E-Mail-Adresse falsch ist. Wahrscheinlich ist dieses Verhalten geeignet, da es unwahrscheinlich ist, dass ein Hacker den Benutzernamen und das Kennwort kennt, aber Brute-Force-Techniken verwenden muss, um die E-Mail-Adresse des Benutzers zu bestimmen.

Schritt 4: Verbessern der Meldung "Ungültige Anmeldeinformationen" des Anmeldesteuerelements

Wenn ein Benutzer versucht, sich mit ungültigen Anmeldeinformationen anzumelden, zeigt das Anmeldesteuerelement eine Meldung an, die erklärt, dass der Anmeldeversuch nicht erfolgreich war. Insbesondere zeigt das Steuerelement die nachricht an, die durch seine FailureText -Eigenschaft angegeben wird, die den Standardwert Ihr Anmeldeversuch war nicht erfolgreich aufweist. Wiederholen Sie den Vorgang.

Denken Sie daran, dass es viele Gründe gibt, warum die Anmeldeinformationen eines Benutzers möglicherweise ungültig sind:

  • Der Benutzername ist möglicherweise nicht vorhanden.
  • Der Benutzername ist vorhanden, aber das Kennwort ist ungültig.
  • Benutzername und Kennwort sind gültig, aber der Benutzer wurde noch nicht genehmigt.
  • Benutzername und Kennwort sind gültig, aber der Benutzer ist gesperrt (wahrscheinlich, weil er die Anzahl der ungültigen Anmeldeversuche innerhalb des angegebenen Zeitraums überschritten hat).

Und es kann andere Gründe für die Verwendung der benutzerdefinierten Authentifizierungslogik geben. Bei dem Code, den wir in Schritt 3 geschrieben haben, sind beispielsweise der Benutzername und das Kennwort möglicherweise gültig, aber die E-Mail-Adresse kann falsch sein.

Unabhängig davon, warum die Anmeldeinformationen ungültig sind, zeigt das Anmeldesteuerelement dieselbe Fehlermeldung an. Dieser Mangel an Feedback kann für einen Benutzer, dessen Konto noch nicht genehmigt wurde oder der gesperrt wurde, verwirrend sein. Mit ein wenig Arbeit können wir jedoch erreichen, dass das Login-Steuerelement eine geeignetere Nachricht anzeigt.

Wenn ein Benutzer versucht, sich mit ungültigen Anmeldeinformationen anzumelden, löst das Anmeldesteuerelement sein Ereignis aus LoginError . Erstellen Sie einen Ereignishandler für dieses Ereignis, und fügen Sie den folgenden Code hinzu:

Protected Sub myLogin_LoginError(ByVal sender As Object, ByVal e As System.EventArgs) Handles myLogin.LoginError
    
 ' Determine why the user could not login...
 myLogin.FailureText = "Your login attempt was not successful. Please try again."
    
 ' Does there exist a User account for this user?
 Dim usrInfo As MembershipUser = Membership.GetUser(myLogin.UserName)

 If usrInfo IsNot Nothing Then
 ' Is this user locked out?
 If usrInfo.IsLockedOut Then
 myLogin.FailureText = "Your account has been locked out because of too many invalid login attempts. Please contact the administrator to have your account unlocked."
 ElseIf Not usrInfo.IsApproved Then
 myLogin.FailureText = "Your account has not yet been approved. You cannot login until an administrator has approved your account."
 End If
 End If
End Sub

Der obige Code beginnt mit dem Festlegen der Eigenschaft des Login-Steuerelements FailureText auf den Standardwert ( Ihr Anmeldeversuch war nicht erfolgreich. Versuchen Sie es erneut. Anschließend wird überprüft, ob der angegebene Benutzername einem vorhandenen Benutzerkonto zugeordnet ist. Wenn dies der Fall ist, werden die eigenschaften und IsApproved des resultierenden MembershipUser Objekts IsLockedOut abgerufen, um festzustellen, ob das Konto gesperrt wurde oder noch nicht genehmigt wurde. In beiden Fällen wird die FailureText Eigenschaft auf einen entsprechenden Wert aktualisiert.

Um diesen Code zu testen, versuchen Sie gezielt, sich als vorhandener Benutzer anzumelden, aber verwenden Sie ein falsches Kennwort. Tun Sie dies fünfMal hintereinander innerhalb eines Zeitrahmens von 10 Minuten, und das Konto wird gesperrt. Wie Abbildung 11 zeigt, schlagen nachfolgende Anmeldeversuche immer fehl (auch mit dem richtigen Kennwort), aber es wird nun die aussagekräftigere Anzeige Angezeigt, dass Ihr Konto aufgrund von zu vielen ungültigen Anmeldeversuchen gesperrt wurde. Wenden Sie sich an den Administrator, um eine Nachricht zu erhalten, die Ihr Konto entsperrt hat.

Tito hat zu viele ungültige Anmeldeversuche durchgeführt und wurde gesperrt

Abbildung 11: Tito hat zu viele ungültige Anmeldeversuche ausgeführt und wurde gesperrt (Klicken Sie hier, um das bild in voller Größe anzuzeigen)

Zusammenfassung

Vor diesem Tutorial hat unsere Anmeldeseite die angegebenen Anmeldeinformationen anhand einer hartcodierten Liste von Benutzernamen/Kennwort-Paaren überprüft. In diesem Tutorial haben wir die Seite aktualisiert, um Anmeldeinformationen für das Mitgliedschaftsframework zu überprüfen. In Schritt 1 haben wir die programmgesteuerte Verwendung der Membership.ValidateUser Methode untersucht. In Schritt 2 haben wir unsere manuell erstellte Benutzeroberfläche und den Code durch das Anmeldesteuerelement ersetzt.

Das Login-Steuerelement rendert eine Standardbenutzerschnittstelle für die Anmeldung und überprüft automatisch die Anmeldeinformationen des Benutzers anhand des Membership-Frameworks. Darüber hinaus meldet das Login-Steuerelement den Benutzer im Falle gültiger Anmeldeinformationen über die Formularauthentifizierung an. Kurz gesagt, eine voll funktionsfähige Anmeldebenutzeroberfläche ist verfügbar, indem Sie einfach das Login-Steuerelement auf eine Seite ziehen, ohne zusätzliches deklaratives Markup oder Code erforderlich. Darüber hinaus ist das Login-Steuerelement hochgradig anpassbar und ermöglicht ein hohes Maß an Kontrolle über die gerenderte Benutzeroberfläche und die Authentifizierungslogik.

An diesem Punkt können Besucher unserer Website ein neues Benutzerkonto erstellen und sich bei der Website anmelden, aber wir haben uns noch nicht damit befasst, den Zugriff auf Seiten basierend auf dem authentifizierten Benutzer einzuschränken. Derzeit kann jeder Benutzer, ob authentifiziert oder anonym, jede Seite auf unserer Website anzeigen. Neben der Kontrolle des Zugriffs auf die Seiten unserer Website auf Benutzerbasis verfügen wir möglicherweise über bestimmte Seiten, deren Funktionalität vom Benutzer abhängt. Im nächsten Tutorial wird erläutert, wie Sie den Zugriff und die Auf-Seite-Funktionalität basierend auf dem angemeldeten Benutzer einschränken.

Viel Spaß beim Programmieren!

Weitere Informationen

Weitere Informationen zu den in diesem Tutorial erläuterten Themen finden Sie in den folgenden Ressourcen:

Zum Autor

Scott Mitchell, Autor mehrerer ASP/ASP.NET-Bücher und Gründer von 4GuysFromRolla.com, arbeitet seit 1998 mit Microsoft-Webtechnologien. Scott arbeitet als unabhängiger Berater, Trainer und Autor. Sein neuestes Buch ist Sams Teach Yourself ASP.NET 2.0 in 24 Stunden. Scott kann unter mitchell@4guysfromrolla.com oder über seinen Blog unter http://ScottOnWriting.NETerreicht werden.

Besonderen Dank an

Diese Tutorialreihe wurde von vielen hilfreichen Prüfern überprüft. Hauptprüfer für dieses Tutorial waren Teresa Murphy und Michael Olivero. Möchten Sie meine anstehenden MSDN-Artikel lesen? Wenn dies der Fall ist, legen Sie eine Zeile unter ab mitchell@4GuysFromRolla.com.