Wiederherstellen und Ändern von Kennwörtern (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
ASP.NET enthält zwei Websteuerelemente zur Unterstützung beim Wiederherstellen und Ändern von Kennwörtern. Das PasswordRecovery-Steuerelement ermöglicht es einem Besucher, sein verlorenes Kennwort wiederherzustellen. Mit dem ChangePassword-Steuerelement kann der Benutzer sein Kennwort aktualisieren. Wie die anderen Login-bezogenen Websteuerelemente, die wir in dieser Tutorialreihe gesehen haben, arbeiten die PasswordRecovery- und ChangePassword-Steuerelemente im Hintergrund mit dem Membership-Framework zusammen, um die Kennwörter von Benutzern zurückzusetzen oder zu ändern.
Einführung
Zwischen den Websites für meine Bank, Versorgungsunternehmen, Telefongesellschaft, E-Mail-Konten und personalisierte Webportale habe ich, wie die meisten Menschen, Dutzende von verschiedenen Kennwörtern zu merken. Mit so vielen Anmeldeinformationen, die in diesen Tagen auswendig gelernt werden müssen, ist es nicht ungewöhnlich, dass Personen ihr Kennwort vergessen. Um dies zu berücksichtigen, müssen Websites, die Benutzerkonten anbieten, eine Möglichkeit für einen Benutzer enthalten, sein Kennwort wiederherzustellen. Bei diesem Prozess wird in der Regel ein neues, zufälliges Kennwort generiert und per E-Mail an die E-Mail-Adresse des Benutzers gesendet. Nachdem sie ihr neues Kennwort erhalten haben, kehren die meisten Benutzer zur Website zurück und ändern ihr Kennwort von dem zufällig generierten Kennwort in ein einprägsameres Kennwort.
ASP.NET enthält zwei Websteuerelemente zur Unterstützung beim Wiederherstellen und Ändern von Kennwörtern. Das PasswordRecovery-Steuerelement ermöglicht es einem Besucher, sein verlorenes Kennwort wiederherzustellen. Mit dem ChangePassword-Steuerelement kann der Benutzer sein Kennwort aktualisieren. Wie die anderen Login-bezogenen Websteuerelemente, die wir in dieser Tutorialreihe gesehen haben, arbeiten die PasswordRecovery- und ChangePassword-Steuerelemente im Hintergrund mit dem Membership-Framework zusammen, um die Kennwörter von Benutzern zurückzusetzen oder zu ändern.
In diesem Tutorial untersuchen wir die Verwendung dieser beiden Steuerelemente. Außerdem erfahren Sie, wie Sie das Kennwort eines Benutzers programmgesteuert über die Methoden und der MembershipUser
Klasse ChangePassword
ändern und ResetPassword
zurücksetzen.
Schritt 1: Unterstützung von Benutzern beim Wiederherstellen verlorener Kennwörter
Alle Websites, die Benutzerkonten unterstützen, müssen Benutzern einen Mechanismus zum Wiederherstellen ihrer vergessenen Kennwörter bereitstellen. Die gute Nachricht ist, dass die Implementierung dieser Funktionalität in ASP.NET dank des PasswordRecovery-Websteuerelements ein Kinderspiel ist. Das PasswordRecovery-Steuerelement rendert eine Schnittstelle, die den Benutzer zur Eingabe seines Benutzernamens und bei Bedarf zur Antwort auf seine Sicherheitsfrage auffordert. Anschließend sendet er dem Benutzer sein Kennwort per E-Mail.
Hinweis
Da E-Mail-Nachrichten per Nur-Text über das Kabel übertragen werden, bestehen Sicherheitsrisiken beim Senden des Kennworts eines Benutzers per E-Mail.
Das PasswordRecovery-Steuerelement besteht aus drei Ansichten:
- Benutzername : Fordert den Besucher zur Eingabe seines Benutzernamens auf. Dies ist die erste Ansicht.
- Frage: Zeigt den Benutzernamen und die Sicherheitsfrage des Benutzers als Text an, zusammen mit einem Textfeld, damit der Benutzer die Antwort auf seine Sicherheitsfrage eingeben kann.
- Erfolg: Zeigt eine Meldung an, die den Benutzer darüber informiert, dass sein Kennwort per E-Mail gesendet wurde.
Die vom PasswordRecovery-Steuerelement ausgeführten Ansichten und Aktionen hängen von den folgenden Einstellungen für die Mitgliedschaftskonfiguration ab:
RequiresQuestionAndAnswer
EnablePasswordRetrieval
EnablePasswordReset
Die Einstellung des Mitgliedschaftsframeworks RequiresQuestionAndAnswer
gibt an, ob Benutzer bei der Registrierung für ein Konto eine Sicherheitsfrage und -antwort angeben müssen. Wie im Tutorial Zum Erstellen von Benutzerkonten erläutert, RequiresQuestionAndAnswer
enthält die CreateUserWizard-Schnittstelle TextBox-Steuerelemente für die Sicherheitsfrage und -antwort des neuen Benutzers. Wenn RequiresQuestionAndAnswer
false ist, werden keine solchen Informationen gesammelt. RequiresQuestionAndAnswer
Auf ähnliche Weise zeigt das PasswordRecovery-Steuerelement die Frageansicht an, nachdem der Benutzer seinen Benutzernamen eingegeben hat. Das Kennwort wird nur wiederhergestellt, wenn der Benutzer die richtige Sicherheitsantwort eingibt. Wenn RequiresQuestionAndAnswer
false ist, wird das PasswordRecovery-Steuerelement jedoch direkt von der UserName-Ansicht zur Ansicht Erfolg verschoben.
Nachdem der Benutzer seinen Benutzernamen oder seinen Benutzernamen und seine Sicherheitsantwort angegeben hat, wenn RequiresQuestionAndAnswer
True ist, sendet die PasswordRecovery dem Benutzer sein Kennwort. Wenn die EnablePasswordRetrieval
Option auf True festgelegt ist, wird dem Benutzer sein aktuelles Kennwort per E-Mail gesendet. Wenn es auf False festgelegt und EnablePasswordReset
auf True festgelegt ist, generiert das PasswordRecovery-Steuerelement ein neues, zufälliges Kennwort für den Benutzer und sendet dieses neue Kennwort per E-Mail an ihn. Wenn beide EnablePasswordRetrieval
und EnablePasswordReset
false sind, löst das PasswordRecovery-Steuerelement eine Ausnahme aus.
Hinweis
Denken Sie daran, dass die Kennwörter der SqlMembershipProvider
Benutzer in einem von drei Formaten gespeichert werden: Clear, Hashed (Standard) oder Encrypted. Der verwendete Speichermechanismus hängt von den Einstellungen für die Mitgliedschaftskonfiguration ab. die Demoanwendung verwendet das Format für hashete Kennwörter. Bei Verwendung des Hashkennwortformats muss die EnablePasswordRetrieval
Option auf False festgelegt werden, da das System das tatsächliche Kennwort des Benutzers aus der in der Datenbank gespeicherten Hashversion nicht ermitteln kann.
Abbildung 1 veranschaulicht, wie die Benutzeroberfläche und das Verhalten von PasswordRecovery von der Membership-Konfiguration beeinflusst werden.
Abbildung 1: Die RequiresQuestionAndAnswer
Darstellung EnablePasswordRetrieval
und EnablePasswordReset
das Verhalten des PasswordRecovery-Steuerelements beeinflussen (Klicken Sie hier, um das bild in voller Größe anzuzeigen)
Hinweis
Im Tutorial Erstellen des Mitgliedschaftsschemas in SQL Server haben wir den Mitgliedschaftsanbieter konfiguriert, indem sie auf True, EnablePasswordRetrieval
False und EnablePasswordReset
auf True festgelegt RequiresQuestionAndAnswer
haben.
Verwenden des PasswordRecovery-Steuerelements
Sehen wir uns die Verwendung des PasswordRecovery-Steuerelements auf einer ASP.NET Seite an. Öffnen Sie RecoverPassword.aspx
ein PasswordRecovery-Steuerelement, und ziehen Sie es aus der Toolbox auf die Designer, und legen Sie es ID
auf RecoverPwd
fest. Wie die Websteuerelemente Login und CreateUserWizard rendern die Ansichten des PasswordRecovery-Steuerelements eine umfassende zusammengesetzte Schnittstelle, die Bezeichnungen, Textfelder, Schaltflächen und Validierungssteuerelemente enthält. Sie können die Darstellung der Ansichten über die Formateigenschaften des Steuerelements oder durch Konvertieren der Ansichten in Vorlagen anpassen. Ich belasse dies als Übung für den interessierten Leser.
Wenn ein Benutzer diese Seite besucht, gibt er ihren Benutzernamen ein und klickt auf die Schaltfläche Senden. Da wir die -Eigenschaft in den Einstellungen für die RequiresQuestionAndAnswer
Mitgliedschaftskonfiguration auf True festgelegt haben, zeigt das PasswordRecovery-Steuerelement dann die Frageansicht an. Nachdem der Benutzer die richtige Sicherheitsantwort eingegeben und auf Senden geklickt hat, aktualisiert das PasswordRecovery-Steuerelement das Kennwort des Benutzers auf ein zufällig generiertes Kennwort und sendet dieses Kennwort per E-Mail an die E-Mail-Adresse in der Datei. All dies war möglich, ohne dass wir eine einzige Codezeile schreiben mussten!
Bevor Sie diese Seite testen, müssen Sie eine letzte Konfiguration ausführen: Wir müssen die E-Mail-Übermittlungseinstellungen in Web.config
angeben. Das PasswordRecovery-Steuerelement verwendet diese Einstellungen für das Senden der E-Mail.
Die E-Mail-Übermittlungskonfiguration wird über das <system.net>
Element des <mailSettings>
Elements angegeben. Verwenden Sie das <smtp>
-Element , um die Übermittlungsmethode und die Standardmäßige From-Adresse anzugeben. Das folgende Markup konfiguriert die E-Mail-Einstellungen für die Verwendung eines SMTP-Netzwerkservers mit dem Namen smtp.example.com
an Port 25 und mit Benutzernamen-/Kennwortanmeldeinformationen für Benutzername und Kennwort.
Hinweis
<system.net>
ist ein untergeordnetes Element des Stammelements <configuration>
und ein gleichgeordnetes Element von <system.web>
. Platzieren Sie das <system.net>
Element daher nicht innerhalb des <system.web>
Elements, sondern auf der gleichen Ebene.
<configuration>
...
<system.net>
<mailSettings>
<smtp deliveryMethod="Network" from="youraddress@example.com">
<network
host="smtp.example.com"
userName="username"
password="password"
port="25" />
</smtp>
</mailSettings>
</system.net>
</configuration>
Zusätzlich zur Verwendung eines SMTP-Servers im Netzwerk können Sie alternativ ein Pickup-Verzeichnis angeben, in dem zu sendende E-Mail-Nachrichten hinterlegt werden sollen.
Nachdem Sie die SMTP-Einstellungen konfiguriert haben, besuchen Sie die RecoverPassword.aspx
Seite über einen Browser. Versuchen Sie zunächst, einen Benutzernamen einzugeben, der nicht im Benutzerspeicher vorhanden ist. Wie Abbildung 2 zeigt, zeigt das PasswordRecovery-Steuerelement eine Meldung an, dass auf die Benutzerinformationen nicht zugegriffen werden konnte. Der Text der Nachricht kann über die -Eigenschaft des Steuerelements UserNameFailureText
angepasst werden.
Abbildung 2: Eine Fehlermeldung wird angezeigt, wenn ein ungültiger Benutzername eingegeben wird (Klicken Sie, um das bild in voller Größe anzuzeigen)
Geben Sie nun einen Benutzernamen ein. Verwenden Sie den Benutzernamen eines Kontos im System mit einer E-Mail-Adresse, auf die Sie zugreifen können und dessen Sicherheitsantwort Sie kennen. Nachdem Sie den Benutzernamen eingegeben und auf Senden geklickt haben, zeigt das PasswordRecovery-Steuerelement die Ansicht "Frage" an. Wenn Sie eine falsche Antwort eingeben, zeigt das PasswordRecovery-Steuerelement wie in der Ansicht Benutzername eine Fehlermeldung an (siehe Abbildung 3). Verwenden Sie die QuestionFailureText
-Eigenschaft , um diese Fehlermeldung anzupassen.
Abbildung 3: Eine Fehlermeldung wird angezeigt, wenn der Benutzer eine ungültige Sicherheitsantwort eingibt (Klicken Sie, um das bild in voller Größe anzuzeigen)
Geben Sie schließlich die richtige Sicherheitsantwort ein, und klicken Sie auf Übermitteln. Im Hintergrund generiert das PasswordRecovery-Steuerelement ein zufälliges Kennwort, weist es dem Benutzerkonto zu, sendet eine E-Mail, die den Benutzer über sein neues Kennwort informiert (siehe Abbildung 4), und zeigt dann die Erfolgsansicht an.
Abbildung 4: Der Benutzer wird ein Email mit seinem neuen Kennwort gesendet (Klicken Sie, um das bild in voller Größe anzuzeigen)
Anpassen der Email
Die vom PasswordRecovery-Steuerelement gesendete Standard-E-Mail ist eher langweilig (siehe Abbildung 4). Die Nachricht wird von dem Konto gesendet, das im Attribut des <smtp>
from
Elements mit dem Betreff Kennwort und dem Texttext angegeben ist:
Kehren Sie zur Website zurück, und melden Sie sich mit den folgenden Informationen an.
Benutzername: Benutzername
Kennwort: Kennwort
Diese Meldung kann programmgesteuert über einen Ereignishandler für das Ereignis des PasswordRecovery-Steuerelements SendingMail
oder deklarativ über die MailDefinition
-Eigenschaft angepasst werden. Lassen Sie uns beide Optionen untersuchen.
Das SendingMail
Ereignis wird direkt vor dem Senden der E-Mail ausgelöst und ist unsere letzte Chance, die E-Mail-Nachricht programmgesteuert anzupassen. Wenn dieses Ereignis ausgelöst wird, wird dem Ereignishandler ein Objekt vom Typ MailMessageEventArgs
übergeben, dessen Message
-Eigenschaft einen Verweis auf die E-Mail enthält, die gesendet werden soll.
Erstellen Sie einen Ereignishandler für das SendingMail
Ereignis, und fügen Sie den folgenden Code hinzu, der der CC-Liste programmgesteuert hinzugefügt wird webmaster@example.com
.
Protected Sub RecoverPwd_SendingMail(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.MailMessageEventArgs)Handles RecoverPwd.SendingMail
e.Message.CC.Add("webmaster@example.com")
End Sub
Die E-Mail-Nachricht kann auch deklarativ konfiguriert werden. Die PasswordRecovery-Eigenschaft MailDefinition
ist ein Objekt vom Typ MailDefinition
. Die MailDefinition
-Klasse bietet eine Vielzahl von E-Mail-bezogenen Eigenschaften, darunter From
, CC
, Priority
, Subject
IsBodyHtml
, BodyFileName
, und andere. Legen Sie zunächst die Subject
-Eigenschaft auf eine aussagekräftigere Eigenschaft als die standardmäßig verwendete (Kennwort) fest, z. B. Ihr Kennwort wurde zurückgesetzt...
Um den Text der E-Mail-Nachricht anzupassen, müssen wir eine separate E-Mail-Vorlagendatei erstellen, die den Inhalt des Textkörpers enthält. Erstellen Sie zunächst einen neuen Ordner mit dem Namen EmailTemplates
auf der Website . Fügen Sie als Nächstes eine neue Textdatei mit dem Namen PasswordRecovery.txt
zu diesem Ordner hinzu, und fügen Sie den folgenden Inhalt hinzu:
Your password has been reset, <%UserName%>!
According to our records, you have requested that your password be reset. Your new
password is: <%Password%>
If you have any questions or trouble logging on please contact a site administrator.
Thank you!
Beachten Sie die Verwendung der Platzhalter <%UserName%>
und <%Password%>
. Das PasswordRecovery-Steuerelement ersetzt diese beiden Platzhalter vor dem Senden der E-Mail automatisch durch den Benutzernamen und das wiederhergestellte Kennwort des Benutzers.
Zeigen Sie schließlich die MailDefinition
-Eigenschaft vonBodyFileName
auf die soeben erstellte E-Mail-Vorlage (~/EmailTemplates/PasswordRecovery.txt
).
Nachdem Sie diese Änderungen vorgenommen haben, besuchen Sie die RecoverPassword.aspx
Seite erneut, und geben Sie Ihren Benutzernamen und Ihre Sicherheitsantwort ein. Sie erhalten eine E-Mail, die wie in Abbildung 5 aussieht. Beachten Sie, dass webmaster@example.com
CC'd wurde und der Betreff und der Text aktualisiert wurden.
Abbildung 5: Betreff, Text und CC-Liste wurden aktualisiert (Klicken Sie hier, um das Bild in voller Größe anzuzeigen)
Um eine HTML-formatierte E-Mail zu senden, legen Sie IsBodyHtml
auf True fest (der Standardwert ist False), und aktualisieren Sie die E-Mail-Vorlage so, dass sie HTML enthält.
Die MailDefinition
Eigenschaft ist nicht für die PasswordRecovery-Klasse eindeutig. Wie wir in Schritt 2 sehen werden, bietet das ChangePassword-Steuerelement auch eine MailDefinition
-Eigenschaft. Darüber hinaus enthält das CreateUserWizard-Steuerelement eine solche Eigenschaft, die Sie so konfigurieren können, dass automatisch eine Willkommens-E-Mail-Nachricht an neue Benutzer gesendet wird.
Hinweis
Derzeit gibt es keine Links im linken Navigationsbereich, um die RecoverPassword.aspx
Seite zu erreichen. Ein Benutzer wäre nur daran interessiert, diese Seite zu besuchen, wenn er sich nicht erfolgreich bei der Website anmelden konnte. Aktualisieren Sie daher die Login.aspx
Seite so, dass sie einen Link zur RecoverPassword.aspx
Seite enthält.
Programmgesteuertes Zurücksetzen des Kennworts eines Benutzers
Beim Zurücksetzen des Kennworts eines Benutzers ruft das PasswordRecovery-Steuerelement die MembershipUser
-Methode desResetPassword
Objekts auf. Diese Methode verfügt über zwei Überladungen:
ResetPassword
: Setzt das Kennwort eines Benutzers zurück. Verwenden Sie diese Überladung, wennRequiresQuestionAndAnswer
false ist.ResetPassword(securityAnswer)
: Setzt das Kennwort eines Benutzers nur zurück, wenn die angegebene securityAnswer korrekt ist. Verwenden Sie diese Überladung, wennRequiresQuestionAndAnswer
true ist.
Beide Überladungen geben das neue, zufällig generierte Kennwort zurück.
Wie bei den anderen Methoden im Membership-Framework delegiert die ResetPassword
Methode an den konfigurierten Anbieter. SqlMembershipProvider
Ruft die aspnet_Membership_ResetPassword
gespeicherte Prozedur auf und übergibt unter anderem den Benutzernamen des Benutzers, das neue Kennwort und die angegebene Kennwortantwort. Die gespeicherte Prozedur stellt sicher, dass die Kennwortantwort übereinstimmt, und aktualisiert dann das Kennwort des Benutzers.
Einige Hinweise zur Implementierung auf niedriger Ebene:
- Ein gesperrter Benutzer kann sein Kennwort nicht zurücksetzen. Ein nicht genehmigter Benutzer kann jedoch. Die gesperrten und genehmigten Zustände werden im Tutorial Entsperren und Genehmigen von Benutzerkonten ausführlicher erläutert.
- Wenn die Kennwortantwort falsch ist, wird die Anzahl der fehlgeschlagenen Kennwortantwortversuche des Benutzers erhöht. Wenn innerhalb eines angegebenen Zeitfensters eine angegebene Anzahl ungültiger Sicherheitsantwortversuche auftritt, wird der Benutzer gesperrt.
Eine Word zur Generierung zufälliger Kennwörter
Die zufällig generierten Kennwörter, die in den E-Mail-Nachrichten in den Abbildungen 4 und 5 angezeigt werden, werden durch die Methode der Membership-Klasse GeneratePassword
erstellt. Diese Methode akzeptiert zwei ganzzahlige Eingabeparameter – length und numberOfNonAlphanumericCharacters – und gibt eine Zeichenfolge mit mindestens langer Länge mit mindestens numberOfNonAlphanumericCharacters anzahl nicht alphanumerischen Zeichen zurück. Wenn diese Methode innerhalb der Mitgliedschaftsklassen oder Login-bezogenen Websteuerelemente aufgerufen wird, werden die Werte für diese beiden Parameter durch die Eigenschaften und MinRequiredNonalphanumericCharacters
der Mitgliedschaftskonfiguration MinRequiredPasswordLength
bestimmt, die auf 7 bzw. 1 festgelegt werden.
Die GeneratePassword
Methode verwendet einen kryptografisch starken Zufallszahlengenerator, um sicherzustellen, dass es keine Verzerrung bei der Auswahl zufälliger Zeichen gibt. Darüber hinaus ist Public
, was bedeutet, GeneratePassword
dass Sie es direkt aus Ihrer ASP.NET-Anwendung verwenden können, wenn Sie zufällige Zeichenfolgen oder Kennwörter generieren müssen.
Hinweis
Die SqlMembershipProvider
-Klasse generiert immer ein zufälliges Kennwort, das mindestens 14 Zeichen lang ist. Wenn MinRequiredPasswordLength
also kleiner als 14 ist, wird der Wert ignoriert.
Schritt 2: Ändern von Kennwörtern
Die zufällig generierten Kennwörter sind schwer zu merken. Sehen Sie sich das in Abbildung 4 gezeigte Kennwort an: WWGUZv(f2yM:Bd
. Versuchen Sie, dies in den Arbeitsspeicher zu übernehmen! Unnötig zu sagen, nachdem einem Benutzer ein zufällig generiertes Kennwort dieser Art gesendet wurde, wird er das Kennwort in etwas einprägsamer ändern möchten.
Verwenden Sie das ChangePassword-Steuerelement, um eine Benutzeroberfläche zu erstellen, über die ein Benutzer sein Kennwort ändern kann. Ähnlich wie das PasswordRecovery-Steuerelement besteht das ChangePassword-Steuerelement aus zwei Ansichten: Kennwort ändern und Erfolg. In der Ansicht Kennwort ändern wird der Benutzer zur Eingabe seiner alten und neuen Kennwörter aufgefordert. Wenn Sie das richtige alte Kennwort und ein neues Kennwort angeben, das die Mindestlänge und nicht alphanumerischen Zeichenanforderungen erfüllt, aktualisiert das ChangePassword-Steuerelement das Kennwort des Benutzers und zeigt die Erfolgsansicht an.
Hinweis
Das ChangePassword-Steuerelement ändert das Kennwort des Benutzers, indem es die MembershipUser
-Methode desChangePassword
Objekts aufruft. Die ChangePassword-Methode akzeptiert zwei String
Eingabeparameter – oldPassword und newPassword – und aktualisiert das Benutzerkonto mit newPassword, sofern das angegebene oldPassword korrekt ist.
Öffnen Sie die ChangePassword.aspx
Seite, und fügen Sie der Seite ein ChangePassword-Steuerelement mit dem Namen ChangePwd
hinzu. An diesem Punkt sollte in der Entwurfsansicht die Ansicht Kennwort ändern angezeigt werden (siehe Abbildung 6). Wie beim PasswordRecovery-Steuerelement können Sie über das Smarttag des Steuerelements zwischen den Ansichten wechseln. Darüber hinaus können die Darstellungen dieser Ansichten über die verschiedenen Stileigenschaften oder durch Konvertieren in eine Vorlage angepasst werden.
Abbildung 6: Hinzufügen eines ChangePassword-Steuerelements zur Seite (Klicken Sie hier, um das Bild in voller Größe anzuzeigen)
Das ChangePassword-Steuerelement kann das Kennwort des aktuell angemeldeten Benutzers oder das Kennwort eines anderen angegebenen Benutzers aktualisieren. Wie abbildung 6 zeigt, rendert die Standardansicht Kennwort ändern nur drei TextBox-Steuerelemente: eines für das alte Kennwort und zwei für das neue Kennwort. Diese Standardschnittstelle wird verwendet, um das Kennwort des aktuell angemeldeten Benutzers zu aktualisieren.
Um das ChangePassword-Steuerelement zum Aktualisieren des Kennworts eines anderen Benutzers zu verwenden, legen Sie die -Eigenschaft des Steuerelements DisplayUserName
auf True fest. Dadurch wird der Seite ein viertes TextBox-Element hinzugefügt, das zur Eingabe des Benutzernamens des Benutzers auffordert, dessen Kennwort geändert werden soll.
Die Einstellung DisplayUserName
auf True ist nützlich, wenn Sie einem abgemeldeten Benutzer erlauben möchten, sein Kennwort zu ändern, ohne sich anmelden zu müssen. Ich persönlich denke, es ist nichts Falsch daran zu verlangen, dass sich ein Benutzer anmeldet, bevor er sein Kennwort ändern kann. Behalten Sie DisplayUserName
daher den Wert false (Standardwert) bei. Bei dieser Entscheidung hindern wir anonyme Benutzer jedoch im Wesentlichen daran, diese Seite zu erreichen. Aktualisieren Sie die URL-Autorisierungsregeln der Website, um anonymen Benutzern den Besuch ChangePassword.aspx
von zu verweigern. Wenn Sie Ihren Arbeitsspeicher mit der Syntax der URL-Autorisierungsregel aktualisieren müssen, lesen Sie das Tutorial zur benutzerbasierten Autorisierung.
Hinweis
Es kann den Anschein haben, dass die DisplayUserName
-Eigenschaft nützlich ist, damit Administratoren die Kennwörter anderer Benutzer ändern können. Auch wenn DisplayUserName
auf True festgelegt ist, muss das richtige alte Kennwort bekannt und eingegeben werden. In Schritt 3 werden Techniken erläutert, mit denen Administratoren die Kennwörter von Benutzern ändern können.
Besuchen Sie die ChangePassword.aspx
Seite über einen Browser, und ändern Sie Ihr Kennwort. Beachten Sie, dass eine Fehlermeldung angezeigt wird, wenn Sie ein neues Kennwort eingeben, das die in der Mitgliedschaftskonfiguration angegebenen Anforderungen für Kennwortlänge und nicht alphanumerische Zeichen nicht erfüllt (siehe Abbildung 7).
Abbildung 7: Hinzufügen eines ChangePassword-Steuerelements zur Seite (Klicken Sie hier, um das Bild in voller Größe anzuzeigen)
Nach Eingabe des richtigen alten Kennworts und eines gültigen neuen Kennworts wird das Kennwort des angemeldeten Benutzers geändert und die Erfolgsansicht angezeigt.
Senden einer Bestätigungs-Email
Standardmäßig sendet das ChangePassword-Steuerelement keine E-Mail-Nachricht an den Benutzer, dessen Kennwort gerade aktualisiert wurde. Wenn Sie eine E-Mail senden möchten, konfigurieren Sie einfach die -Eigenschaft des Steuerelements MailDefinition
. Konfigurieren Sie das ChangePassword-Steuerelement so, dass dem Benutzer eine HTML-formatierte E-Mail mit dem neuen Kennwort gesendet wird.
Erstellen Sie zunächst eine neue Datei im Ordner mit dem EmailTemplates
Namen ChangePassword.htm
. Fügen Sie das folgende Markup hinzu:
<html>
<body>
<h2>Your Password Has Been Changed!</h2>
<p>
This email confirms that your password has been changed.
</p>
<p>
To log on to the site, use the following credentials:
</p>
<table>
<tr>
<td>
<b>Username:</b>
</td>
<td>
<%UserName%>
</td>
</tr>
<tr>
<td>
<b>Password:</b>
</td>
<td>
<%Password%>
</td>
</tr>
</table>
<p>
If you have any questions or encounter any problems logging in,
please contact a site administrator.
</p>
</body>
</html>
Legen Sie als Nächstes die Eigenschaften , IsBodyHtml
und Subject
der Eigenschaft des BodyFileName
ChangePassword-Steuerelements MailDefinition
auf ~/EmailTemplates/ChangePassword.htm, True und Ihr Kennwort wurde geändert! fest.
Nachdem Sie diese Änderungen vorgenommen haben, besuchen Sie die Seite erneut, und ändern Sie Ihr Kennwort erneut. Dieses Mal sendet das ChangePassword-Steuerelement eine angepasste, HTML-formatierte E-Mail an die E-Mail-Adresse des Benutzers in der Datei (siehe Abbildung 8).
Abbildung 8: Eine Email Nachricht informiert den Benutzer darüber, dass sein Kennwort geändert wurde (Klicken Sie hier, um das bild in voller Größe anzuzeigen)
Schritt 3: Zulassen, dass Administratoren die Kennwörter von Benutzern ändern können
Ein häufiges Feature in Anwendungen, die Benutzerkonten unterstützen, ist die Möglichkeit eines Administratorbenutzers, die Kennwörter anderer Benutzer zu ändern. Manchmal ist diese Funktionalität erforderlich, da das System nicht in der Lage ist, ihre eigenen Kennwörter zu ändern. In einem solchen Fall kann ein Benutzer sein vergessenes Kennwort nur wiederherstellen, wenn der Administrator ihm ein neues Kennwort zuweist. Mit den Steuerelementen PasswordRecovery und ChangePassword müssen sich administrative Benutzer jedoch nicht mit dem Ändern der Benutzerkennwörter beschäftigen, da Benutzer dies selbst tun können.
Was aber, wenn Ihr Client darauf besteht, dass Administratoren die Kennwörter anderer Benutzer ändern können? Leider kann das Hinzufügen dieser Funktionalität ein wenig Arbeit sein. Um das Kennwort eines Benutzers zu ändern, muss sowohl das alte als auch das neue Kennwort für die Methode des MembershipUser
ChangePassword
Objekts angegeben werden, aber ein Administrator sollte nicht das Kennwort eines Benutzers kennen müssen, um es zu ändern.
Eine Problemumgehung besteht darin, zuerst das Kennwort des Benutzers zurückzusetzen und es dann mithilfe von Code wie dem folgenden in das neue Kennwort zu ändern:
Dim usr As MembershipUser = Membership.GetUser(username)
Dim resetPwd As String = usr.ResetPassword()
usr.ChangePassword(resetPwd, newPassword)
Dieser Code beginnt mit dem Abrufen von Informationen zum Benutzernamen, d. h. dem Benutzer, dessen Kennwort der Administrator ändern möchte. Als Nächstes wird die ResetPassword
-Methode aufgerufen, die dem Benutzer ein neues, zufälliges Kennwort zuweist. Dieses zufällig generierte Kennwort wird von der -Methode zurückgegeben und in der Variablen resetPwd
gespeichert. Nachdem wir das Kennwort des Benutzers kennen, können wir es über einen Aufruf von ChangePassword
ändern.
Das Problem besteht darin, dass dieser Code nur funktioniert, wenn die Mitgliedschaftssystemkonfiguration auf RequiresQuestionAndAnswer
False festgelegt ist. Wenn RequiresQuestionAndAnswer
true ist, wie bei unserer Anwendung, muss die ResetPassword
-Methode die Sicherheitsantwort übergeben werden, andernfalls wird eine Ausnahme ausgelöst.
Wenn das Mitgliedschaftsframework so konfiguriert ist, dass eine Sicherheitsfrage und -antwort erforderlich ist und Ihr Client dennoch darauf besteht, dass Administratoren die Kennwörter der Benutzer ändern können, haben Sie drei Optionen:
- Werfen Sie ihre Hände in die Luft und sagen Sie Ihrem Kunden, dass dies nur eine Sache ist, die nicht möglich ist.
- Legen Sie auf False fest
RequiresQuestionAndAnswer
. Dies führt zu einer weniger sicheren Anwendung. Stellen Sie sich vor, ein ruchhafter Benutzer hat Zugriff auf den E-Mail-Posteingang eines anderen Benutzers erhalten. Vielleicht hat der kompromittierte Benutzer seinen Schreibtisch verlassen, um zum Mittagessen zu gehen, und hat seine Arbeitsstation nicht gesperrt, oder vielleicht hat er auf seine E-Mails über ein öffentliches Terminal zugegriffen und sich nicht abgemeldet. In beiden Fällen kann der ruchhafte Benutzer dieRecoverPassword.aspx
Seite besuchen und den Benutzernamen des Benutzers eingeben. Das System sendet dann eine E-Mail mit dem wiederhergestellten Kennwort, ohne die Sicherheitsantwort einzugeben. - Umgehen Sie die vom Membership-Framework erstellte Abstraktionsebene, und arbeiten Sie direkt mit der SQL Server-Datenbank. Das Mitgliedschaftsschema enthält eine gespeicherte Prozedur namens
aspnet_Membership_SetPassword
, die das Kennwort eines Benutzers festlegt und keine Sicherheitsantwort oder ein altes Kennwort erfordert, um die Aufgabe zu erfüllen.
Keine dieser Optionen ist besonders ansprechend, aber so verläuft das Leben eines Entwicklers manchmal.
Ich habe den dritten Ansatz implementiert, nämlich code geschrieben, der die Membership
Klassen und MembershipUser
-Klassen umgeht und direkt für die SecurityTutorials
Datenbank arbeitet.
Hinweis
Durch die direkte Arbeit mit der Datenbank wird die vom Mitgliedschaftsframework bereitgestellte Kapselung unterbrochen. Diese Entscheidung bindet uns an die SqlMembershipProvider
, wodurch unser Code weniger portabel ist. Darüber hinaus funktioniert dieser Code möglicherweise nicht wie erwartet in zukünftigen Versionen von ASP.NET, wenn sich das Mitgliedschaftsschema ändert. Dieser Ansatz ist eine Problemumgehung und ist wie die meisten Problemumgehungen kein Beispiel für bewährte Methoden.
Der Code hat einige unattraktive Bits und ist ziemlich lang. Daher möchte ich dieses Tutorial nicht mit einer eingehenden Untersuchung darüber überladen. Wenn Sie mehr erfahren möchten, laden Sie den Code für dieses Tutorial herunter, und besuchen Sie die ~/Administration/ManageUsers.aspx
Seite. Auf dieser Seite, die wir im vorherigen Tutorial erstellt haben, werden die einzelnen Benutzer aufgelistet. Ich habe die GridView aktualisiert, um einen Link zur Seite einzuschließen UserInformation.aspx
und den Benutzernamen des ausgewählten Benutzers über die Abfragezeichenfolge zu übergeben. Auf UserInformation.aspx
der Seite werden Informationen zum ausgewählten Benutzer und TextBoxes zum Ändern des Kennworts angezeigt (siehe Abbildung 9).
Nach der Eingabe des neuen Kennworts, der Bestätigung im zweiten Textfeld und dem Klicken auf die Schaltfläche "Benutzer aktualisieren" erfolgt ein Postback, und die aspnet_Membership_SetPassword
gespeicherte Prozedur wird aufgerufen, wobei das Kennwort des Benutzers aktualisiert wird. Ich ermutige diejenigen Leser, die an dieser Funktionalität interessiert sind, sich mit dem Code vertraut zu machen und zu versuchen, die Funktionalität zu erweitern, um eine E-Mail an den Benutzer zu senden, dessen Kennwort geändert wurde.
Abbildung 9: Ein Administrator kann das Kennwort eines Benutzers ändern (Klicken Sie hier, um das bild in voller Größe anzuzeigen)
Hinweis
Die UserInformation.aspx
Seite funktioniert derzeit nur, wenn das Mitgliedschaftsframework zum Speichern von Kennwörtern im Clear- oder Hashed-Format konfiguriert ist. Es fehlt der Code zum Verschlüsseln des neuen Kennworts, obwohl Sie aufgefordert werden, diese Funktionalität hinzuzufügen. Ich empfehle, den erforderlichen Code hinzuzufügen, indem Sie einen Dekompilierer wie Reflector verwenden, um den Quellcode auf Methoden im .NET Framework zu untersuchen. Beginnen Sie mit der Untersuchung der Methode der SqlMembershipProvider
ChangePassword
Klasse. Dies ist die Technik, die ich verwendet habe, um den Code zum Erstellen eines Hashs des Kennworts zu schreiben.
Zusammenfassung
ASP.NET bietet zwei Steuerelemente, mit denen Benutzer ihr Kennwort verwalten können. Das PasswordRecovery-Steuerelement ist nützlich für diejenigen, die ihre Kennwörter vergessen haben. Abhängig von der Konfiguration des Mitgliedschaftsframeworks erhält der Benutzer entweder sein vorhandenes Kennwort oder ein neues, zufällig generiertes Kennwort per E-Mail. Das ChangePassword-Steuerelement ermöglicht es einem Benutzer, sein Kennwort zu aktualisieren.
Wie die Steuerelemente Login und CreateUserWizard rendern die Steuerelemente PasswordRecovery und ChangePassword eine umfassende Benutzeroberfläche, ohne einen Lick des deklarativen Markups oder einer Codezeile schreiben zu müssen. Wenn die Standard-Benutzeroberfläche Nicht Ihren Anforderungen entspricht, können Sie sie über eine Vielzahl von Formateigenschaften anpassen. Alternativ können die Schnittstellen der Steuerelemente für ein noch feines Maß an Kontrolle in Vorlagen konvertiert werden. Im Hintergrund verwenden diese Steuerelemente die Mitgliedschafts-API und aufrufen die MembershipUser
Methoden und ChangePassword
des ResetPassword
Objekts.
Viel Spaß beim Programmieren!
Weitere Informationen
Weitere Informationen zu den in diesem Tutorial erläuterten Themen finden Sie in den folgenden Ressourcen:
- Schnellstarts zum ChangePassword-Steuerelement
- PasswordRecovery-Steuerelement – Schnellstart
- Senden von Email in ASP.NET
System.Net.Mail
Faqs
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. Zu den leitenden Prüfern für dieses Tutorial gehören Michael Emmings und Suchi Banerjee. Möchten Sie meine anstehenden MSDN-Artikel lesen? Wenn dies der Fall ist, legen Sie mir eine Zeile unter mitchell@4GuysFromRolla.com
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Issues stufenweise als Feedbackmechanismus für Inhalte abbauen und durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unterFeedback senden und anzeigen für