Wiederherstellen und Ändern von Kennwörtern (C#)
von Scott Mitchell
Hinweis
Da dieser Artikel geschrieben wurde, werden die ASP.NET Mitgliedschaftsanbieter durch ASP.NET Identity ersetzt. Es wird dringend empfohlen, Apps so zu aktualisieren, dass sie die ASP.NET Identity Platform anstelle der Mitgliedschaftsanbieter verwenden, die zum Zeitpunkt dieses Artikels vorgestellt wurden. ASP.NET Identity hat 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
- Anspruchsbasierte Identitätsunterstützung
- 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 anmeldebezogenen Websteuerelemente, die wir in dieser Lernprogrammreihe gesehen haben, funktionieren die PasswordRecovery- und ChangePassword-Steuerelemente im Hintergrund mit dem Mitgliedschaftsframework, um die Kennwörter von Benutzern zurückzusetzen oder zu ändern.
Einführung
Zwischen den Websites für meine Bank, Versorgungsunternehmen, Telefonfirma, E-Mail-Konten und personalisierte Webportale, habe ich wie die meisten Leute Dutzende von verschiedenen Kennwörtern zu merken. Mit so vielen Anmeldeinformationen, die sich diese Tage merken, ist es nicht ungewöhnlich, dass Benutzer ihr Kennwort vergessen. Um dies zu berücksichtigen, müssen Websites, die Benutzerkonten anbieten, eine Möglichkeit enthalten, damit ein Benutzer sein Kennwort wiederherstellen kann. Dieser Vorgang umfasst in der Regel das Generieren eines neuen, zufälligen Kennworts und das Senden einer E-Mail an die E-Mail-Adresse des Benutzers in der Datei. 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 unvergessliches 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 anmeldebezogenen Websteuerelemente, die wir in dieser Lernprogrammreihe gesehen haben, funktionieren die PasswordRecovery- und ChangePassword-Steuerelemente im Hintergrund mit dem Mitgliedschaftsframework, um die Kennwörter von Benutzern zurückzusetzen oder zu ändern.
In diesem Lernprogramm untersuchen wir die Verwendung dieser beiden Steuerelemente. Darüber hinaus wird gezeigt, wie Sie das Kennwort eines Benutzers programmgesteuert über die MembershipUser
Klassen ChangePassword
und Methoden ändern und ResetPassword
zurücksetzen.
Schritt 1: Helfen der Benutzer 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 solcher Funktionen in ASP.NET dank des PasswordRecovery-Websteuerelements ein Kinderspiel ist. Das PasswordRecovery-Steuerelement rendert eine Benutzeroberfläche, die den Benutzer zur Eingabe seines Benutzernamens auffordert, und bei Bedarf die Antwort auf seine Sicherheitsfrage. Anschließend wird dem Benutzer sein Kennwort per E-Mail gesendet.
Hinweis
Da E-Mail-Nachrichten per Nur-Text über das Kabel übertragen werden, sind Sicherheitsrisiken beim Senden des Kennworts eines Benutzers per E-Mail verbunden.
Das PasswordRecovery-Steuerelement besteht aus drei Ansichten:
- UserName – 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 TextBox-Element, in das der Benutzer die Antwort auf seine Sicherheitsfrage eingeben kann.
- Erfolgsmeldung: 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 Konfigurationseinstellungen für die Mitgliedschaft ab:
RequiresQuestionAndAnswer
EnablePasswordRetrieval
EnablePasswordReset
Die Einstellung des Mitgliedschaftsframeworks RequiresQuestionAndAnswer
gibt an, ob Benutzer beim Registrieren für ein Konto eine Sicherheitsfrage und Antwort angeben müssen. Wie im Lernprogramm zum Erstellen von Benutzerkonten erläutert, enthält RequiresQuestionAndAnswer
die Benutzeroberfläche von CreateUserWizard TextBox-Steuerelemente für die Sicherheitsfrage und -antwort des neuen Benutzers. Wenn RequiresQuestionAndAnswer
"False" lautet, werden keine derartigen Informationen gesammelt. RequiresQuestionAndAnswer
Wenn "True" lautet, 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. Ist " RequiresQuestionAndAnswer
False", wird das PasswordRecovery-Steuerelement jedoch direkt aus der UserName-Ansicht in die Erfolgsansicht verschoben.
Nachdem der Benutzer seinen Benutzernamen oder seinen Benutzernamen und seine Sicherheitsantwort angegeben hat, falls RequiresQuestionAndAnswer
wahr, sendet der PasswordRecovery-Benutzer sein Kennwort per E-Mail. Wenn die EnablePasswordRetrieval
Option auf "True" festgelegt ist, wird der Benutzer per E-Mail an sein aktuelles Kennwort gesendet. Wenn er auf "False" festgelegt ist und EnablePasswordReset
auf "True" festgelegt ist, generiert das PasswordRecovery-Steuerelement ein neues, zufälliges Kennwort für den Benutzer und sendet dieses neue Kennwort an ihn. Wenn beides EnablePasswordRetrieval
" EnablePasswordReset
False" ist, löst das PasswordRecovery-Steuerelement eine Ausnahme aus.
Hinweis
Erinnern Sie sich daran, dass die Kennwörter der SqlMembershipProvider
Benutzer in einem von drei Formaten gespeichert werden: "Löschen", "Hashed" (Standard) oder "Verschlüsselt". Der verwendete Speichermechanismus hängt von den Einstellungen für die Mitgliedschaftskonfiguration ab; die Demoanwendung verwendet das Kennwortformat "Hashed". Wenn Sie das Kennwortformat "Hashed" verwenden, 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 Mitgliedschaftskonfiguration beeinflusst werden.
Abbildung 1: Das EnablePasswordRetrieval
RequiresQuestionAndAnswer
, und EnablePasswordReset
beeinflussen das Aussehen und Verhalten des PasswordRecovery-Steuerelements (Klicken Sie, um das Bild in voller Größe anzuzeigen)
Hinweis
Im Lernprogramm zum Erstellen des Mitgliedschaftsschemas in SQL Server haben wir den Mitgliedschaftsanbieter durch Festlegen RequiresQuestionAndAnswer
auf "True", EnablePasswordRetrieval
"False" und EnablePasswordReset
"True" konfiguriert.
Verwenden des PasswordRecovery-Steuerelements
Sehen wir uns die Verwendung des PasswordRecovery-Steuerelements auf einer ASP.NET Seite an. Öffnen RecoverPassword.aspx
und Ziehen und Ablegen eines PasswordRecovery-Steuerelements aus der Toolbox auf den Designer; legen Sie den Wert ID
auf .RecoverPwd
Wie die Websteuerelemente "Login" und "CreateUserWizard" rendern die Ansichten des PasswordRecovery-Steuerelements eine umfangreiche zusammengesetzte Schnittstelle, die Bezeichnungen, TextBoxen, Schaltflächen und Überprüfungssteuerelemente enthält. Sie können die Darstellung der Ansichten über die Formateigenschaften des Steuerelements anpassen oder indem Sie die Ansichten in Vorlagen konvertieren. Ich belässt dies als Übung für den interessierten Leser.
Wenn ein Benutzer diese Seite besucht, gibt er ihren Benutzernamen ein, und klicken Sie auf die Schaltfläche "Absenden". Da wir die Eigenschaft in den Konfigurationseinstellungen der RequiresQuestionAndAnswer
Mitgliedschaft auf "True" festgelegt haben, zeigt das Steuerelement "PasswordRecovery" dann die Frageansicht an. Nachdem der Benutzer seine richtige Sicherheitsantwort eingegeben und auf "Absenden" klickt, aktualisiert das PasswordRecovery-Steuerelement das Kennwort des Benutzers auf ein zufällig generiertes Kennwort, und sendet dieses Kennwort an die E-Mail-Adresse in der Datei. All dies war möglich, ohne dass wir eine einzelne Codezeile schreiben müssen!
Bevor Sie diese Seite testen, gibt es eine letzte Konfiguration, die dazu neigen soll: Wir müssen die Einstellungen für die E-Mail-Zustellung angeben in Web.config
. Das PasswordRecovery-Steuerelement basiert auf diesen Einstellungen zum Senden der E-Mail.
Die Konfiguration der E-Mail-Zustellung wird über das <system.net>
Element des <mailSettings>
Elements angegeben. Verwenden Sie das <smtp>
Element , um die Übermittlungsmethode und die Standardadresse "Von" anzugeben. Das folgende Markup konfiguriert E-Mail-Einstellungen für die Verwendung eines SMTP-Netzwerkservers mit dem Namen smtp.example.com
"Port 25" und mit Benutzernamen-/Kennwortanmeldeinformationen von Benutzername und Kennwort.
Hinweis
<system.net>
ist ein untergeordnetes Element des Stammelements <configuration>
und eines gleichgeordneten Elements von <system.web>
. Platzieren Sie daher das Element nicht innerhalb des <system.net>
<system.web>
Elements, sondern platzieren Sie es auf derselben 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 E-Mail-Nachrichten abgelegt werden sollen.
Nachdem Sie die SMTP-Einstellungen konfiguriert haben, besuchen Sie die RecoverPassword.aspx
Seite über einen Browser. Versuchen Sie zuerst, einen Benutzernamen einzugeben, der im Benutzerspeicher nicht vorhanden ist. Wie in Abbildung 2 dargestellt, zeigt das PasswordRecovery-Steuerelement eine Meldung an, die angibt, 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 deren Sicherheitsantwort Sie kennen. Nachdem Sie den Benutzernamen eingegeben und auf "Absenden" geklickt haben, zeigt das PasswordRecovery-Steuerelement die Frageansicht an. Wie in der UserName-Ansicht zeigt das PasswordRecovery-Steuerelement eine Fehlermeldung an, wenn Sie eine falsche Antwort eingeben (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 hier, um das Bild in voller Größe anzuzeigen)
Geben Sie schließlich die richtige Sicherheitsantwort ein, und klicken Sie auf "Absenden". Hinter den Kulissen 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 eine E-Mail mit seinem neuen Kennwort gesendet (Klicken Sie hier, um das Bild in voller Größe anzuzeigen)
Anpassen der E-Mail
Die vom PasswordRecovery-Steuerelement gesendete Standard-E-Mail ist eher langweilig (siehe Abbildung 4). Die Nachricht wird aus dem Konto gesendet, das im Attribut des <smtp>
from
Elements mit dem Betreff "Password" und dem Nur-Text-Text angegeben ist:
Kehren Sie zur Website zurück, und melden Sie sich mit den folgenden Informationen an.
Benutzername: Benutzername
Kennwort: Kennwort
Diese Nachricht kann programmgesteuert über einen Ereignishandler für das Ereignis des PasswordRecovery-Steuerelements SendingMail
oder deklarativ über die MailDefinition
Eigenschaft angepasst werden. Sehen wir uns beide Optionen an.
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 der 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 programmgesteuert der CC-Liste hinzugefügt webmaster@example.com
wird.
protected void RecoverPwd_SendingMail(object sender, MailMessageEventArgs e)
{
e.Message.CC.Add("webmaster@example.com");
}
Die E-Mail-Nachricht kann auch über deklarative Mittel konfiguriert werden. Die PasswordRecovery-Eigenschaft MailDefinition
ist ein Objekt vom Typ MailDefinition
. Die MailDefinition
Klasse bietet eine Vielzahl von E-Mail-bezogenen Eigenschaften, einschließlich From
, , CC
, Priority
Subject
, IsBodyHtml
, BodyFileName
und andere. Legen Sie zunächst die Subject
Eigenschaft auf einen aussagekräftigeren Wert als das standardmäßig verwendete (Kennwort) fest, z. B. Ihr Kennwort wurde zurückgesetzt...
Zum Anpassen des Textkörpers der E-Mail-Nachricht müssen wir eine separate E-Mail-Vorlagendatei erstellen, die den Inhalt des Textkörpers enthält. Erstellen Sie zunächst einen neuen Ordner in der Website mit dem Namen EmailTemplates
. Fügen Sie als Nächstes eine neue Textdatei zu diesem Ordner mit dem Namen PasswordRecovery.txt
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 automatisch durch den Benutzernamen des Benutzers und das wiederhergestellte Kennwort vor dem Senden der E-Mail.
Zeigen Sie schließlich die Eigenschaft 's BodyFileName
auf die MailDefinition
E-Mail-Vorlage, die wir soeben erstellt haben (~/EmailTemplates/PasswordRecovery.txt
).
Nachdem Sie diese Änderungen vorgenommen haben, überprüfen Sie die RecoverPassword.aspx
Seite, und geben Sie Ihre Benutzernamen- und Sicherheitsantwort ein. Sie erhalten eine E-Mail, die wie in Abbildung 5 aussieht. Beachten Sie, dass webmaster@example.com
cc'd war und dass der Betreff und der Textkörper aktualisiert wurden.
Abbildung 5: Die Betreff-, Text- und CC-Liste wurden aktualisiert (Klicken Sie, um das Bild in voller Größe anzuzeigen)
Zum Senden einer HTML-formatierten E-Mail IsBodyHtml
auf "True" (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, 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 in der linken Navigation, 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 Methode des MembershipUser
ResetPassword
Objekts auf. Diese Methode verfügt über zwei Überladungen:
ResetPassword
– setzt das Kennwort eines Benutzers zurück. Verwenden Sie diese Überladung, wennRequiresQuestionAndAnswer
"False" lautet.ResetPassword(securityAnswer)
- Setzt das Kennwort eines Benutzers nur zurück, wenn der 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. Die SqlMembershipProvider
gespeicherte aspnet_Membership_ResetPassword
Prozedur wird aufgerufen, wobei unter anderem der Benutzername des Benutzers, das neue Kennwort und die angegebene Kennwortantwort übergeben werden. Die gespeicherte Prozedur stellt sicher, dass die Kennwortantwort übereinstimmt und dann das Kennwort des Benutzers aktualisiert.
Einige Hinweise zur Implementierung auf niedriger Ebene:
- Ein gesperrter Benutzer kann sein Kennwort nicht zurücksetzen. Ein nicht genehmigter Benutzer kann jedoch. Im Lernprogramm zum Entsperren und Genehmigen von Benutzerkonten werden wir die gesperrten und genehmigten Zustände ausführlicher besprechen.
- Wenn die Kennwortantwort falsch ist, wird die Anzahl der fehlgeschlagenen Kennwortantwortversuche des Benutzers erhöht. Wenn innerhalb eines angegebenen Zeitfensters eine bestimmte Anzahl ungültiger Sicherheitsantwortversuche auftritt, wird der Benutzer gesperrt.
Ein Wort zum Generieren der zufälligen Kennwörter
Die zufällig generierten Kennwörter in den E-Mail-Nachrichten in Abbildung 4 und 5 werden von der Methode der Mitgliedschaftsklasse GeneratePassword
erstellt. Diese Methode akzeptiert zwei ganzzahlige Eingabeparameter - Länge und NumberOfNonAlphanumericCharacters - und gibt eine Zeichenfolge mit mindestens längenlangen Zeichen mit mindestens numberOfNonAlphanumericCharacters Anzahl von nicht alphanumerischen Zeichen zurück. Wenn diese Methode aus den Mitgliedschaftsklassen oder anmeldebezogenen Websteuerelementen aufgerufen wird, werden die Werte für diese beiden Parameter durch die Eigenschaften und MinRequiredNonalphanumericCharacters
Eigenschaften der Mitgliedschaftskonfiguration MinRequiredPasswordLength
bestimmt, die wir auf 7 bzw. 1 festlegen.
Die GeneratePassword
Methode verwendet einen kryptografisch starken Zufallszahlengenerator, um sicherzustellen, dass keine Verzerrungen in den zufälligen Zeichen ausgewählt sind. GeneratePassword
Darüber hinaus können public
Sie sie direkt aus Ihrer ASP.NET-Anwendung verwenden, wenn Sie zufällige Zeichenfolgen oder Kennwörter generieren müssen.
Hinweis
Die SqlMembershipProvider
Klasse generiert immer mindestens 14 Zeichen lang ein zufälliges Kennwort. 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. Betrachten Sie das in Abbildung 4 gezeigte Kennwort: WWGUZv(f2yM:Bd
. Versuchen Sie, dies im Arbeitsspeicher zu übernehmen! Wenn ein Benutzer ein zufällig generiertes Kennwort dieser Art gesendet hat, muss er das Kennwort unnötigerweise in einprägsameres Kennwort ändern.
Verwenden Sie das ChangePassword-Steuerelement, um eine Benutzeroberfläche für einen Benutzer zu erstellen, um ihr Kennwort zu ändern. Ähnlich wie das PasswordRecovery-Steuerelement besteht das ChangePassword-Steuerelement aus zwei Ansichten: "Kennwort ändern" und "Erfolg". Die Ansicht "Kennwort ändern" fordert den Benutzer zur Eingabe seiner alten und neuen Kennwörter auf. 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 durch Aufrufen der Methode des MembershipUser
ChangePassword
Objekts. Die ChangePassword-Methode akzeptiert zwei string
Eingabeparameter : oldPassword und newPassword - und aktualisiert das Konto des Benutzers mit dem neuenPassword, vorausgesetzt, das angegebene oldPassword ist richtig.
Öffnen Sie die ChangePassword.aspx
Seite, und fügen Sie der Seite ein ChangePassword-Steuerelement hinzu, und nennen Sie es ChangePwd
. 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 umschalten. Darüber hinaus können die Darstellungen dieser Ansichten über die sortierten Formateigenschaften angepasst werden, oder indem sie in eine Vorlage konvertiert 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 aktuell angemeldete Kennwort oder das Kennwort eines anderen, angegebenen Benutzers aktualisieren. Wie in Abbildung 6 dargestellt, 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.
Wenn Sie das ChangePassword-Steuerelement verwenden möchten, um das Kennwort eines anderen Benutzers zu aktualisieren, legen Sie die Eigenschaft des DisplayUserName
Steuerelements 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.
Das Festlegen DisplayUserName
auf "True" ist nützlich, wenn Sie zulassen möchten, dass ein abgemeldeter Benutzer sein Kennwort ändert, ohne sich anmelden zu müssen. Persönlich denke ich, dass es nichts falsch ist, wenn ein Benutzer sich anmelden muss, bevor er es erlaubt, sein Kennwort zu ändern. Lassen Sie DisplayUserName
daher "False" (Standardeinstellung) fest. Bei dieser Entscheidung wird jedoch im Wesentlichen verhindert, dass anonyme Benutzer diese Seite erreichen. Aktualisieren Sie die URL-Autorisierungsregeln der Website, um anonymen Benutzern den Besuch ChangePassword.aspx
zu verweigern. Wenn Sie Den Speicher für die Syntax der URL-Autorisierungsregel aktualisieren müssen, lesen Sie das Lernprogramm zur benutzerbasierten Autorisierung.
Hinweis
Es kann vorkommen, dass die DisplayUserName
Eigenschaft nützlich ist, damit Administratoren die Kennwörter anderer Benutzer ändern können. Selbst wenn DisplayUserName
jedoch auf "True" festgelegt ist, muss das richtige alte Kennwort bekannt und eingegeben werden. Wir werden über Techniken sprechen, mit denen Administratoren die Kennwörter von Benutzern in Schritt 3 ä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 die 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)
Wenn Sie das richtige alte Kennwort und ein gültiges neues Kennwort eingeben, wird das Kennwort des angemeldeten Benutzers geändert und die Erfolgsansicht angezeigt.
Senden einer Bestätigungs-E-Mail
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 wir das ChangePassword-Steuerelement so, dass der Benutzer eine HTML-formatierte E-Mail mit seinem 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 Eigenschaft des ChangePassword-Steuerelements IsBodyHtml
MailDefinition
BodyFileName
und Subject
die Eigenschaften auf ~/EmailTemplates/ChangePassword.htm, True und Ihr Kennwort geändert! fest.
Nachdem Sie diese Änderungen vorgenommen haben, überprüfen Sie die Seite, 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 E-Mail-Nachricht informiert den Benutzer darüber, dass sein Kennwort geändert wurde (Klicken Sie, um das Bild in voller Größe anzuzeigen)
Schritt 3: Zulassen, dass Administratoren die Kennwörter von Benutzern ändern können
Ein gängiges Feature in Anwendungen, die Benutzerkonten unterstützen, ist die Möglichkeit, dass ein Administratorbenutzer die Kennwörter anderer Benutzer ändern kann. Manchmal ist diese Funktionalität erforderlich, da das System nicht in der Lage ist, ihre eigenen Kennwörter zu ändern. In diesem Fall wäre die einzige Möglichkeit, wie ein Benutzer sein vergessenes Kennwort wiederherstellen kann, dem Administrator ein neues Kennwort zuzuweisen. Bei den Steuerelementen PasswordRecovery und ChangePassword müssen sich administrative Benutzer jedoch nicht mit dem Ändern der Kennwörter der Benutzer beschäftigen, da Benutzer dies selbst erledigen können.
Aber was geschieht, wenn Ihr Client darauf besteht, dass administrative Benutzer die Kennwörter anderer Benutzer ändern können? Leider kann das Hinzufügen dieser Funktionalität ein bisschen Arbeit sein. Um das Kennwort eines Benutzers zu ändern, muss sowohl das alte als auch das neue Kennwort für die Methode des MembershipUser
Objekts ChangePassword
angegeben werden, aber ein Administrator sollte das Kennwort eines Benutzers nicht 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:
MembershipUser usr = Membership.GetUser(username);
string resetPwd = usr.ResetPassword();
usr.ChangePassword(resetPwd, newPassword);
Dieser Code beginnt mit dem Abrufen von Informationen über den Benutzernamen, bei dem es sich um den Benutzer handelt, 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. Da wir nun das Kennwort des Benutzers kennen, können wir es über einen Aufruf ChangePassword
ändern.
Das Problem besteht darin, dass dieser Code nur funktioniert, wenn die Konfiguration des Mitgliedschaftssystems so festgelegt ist, dass RequiresQuestionAndAnswer
"False" lautet. Wenn RequiresQuestionAndAnswer
"True" ist, wie bei unserer Anwendung, muss die ResetPassword
Methode die Sicherheitsantwort übergeben werden, andernfalls löst sie eine Ausnahme aus.
Wenn das Mitgliedschaftsframework so konfiguriert ist, dass eine Sicherheitsfrage und Antwort erforderlich ist und Ihr Client dennoch darauf besteht, dass Administratoren die Kennwörter von Benutzern ändern können, haben Sie drei Optionen:
- Werfen Sie Ihre Hände in die Luft und teilen Sie Ihrem Kunden mit, dass dies nur eine Sache ist, die nicht getan werden kann.
- Auf "False" festgelegt
RequiresQuestionAndAnswer
. Dies führt zu einer weniger sicheren Anwendung. Stellen Sie sich vor, dass ein nefariger Benutzer Zugriff auf den E-Mail-Posteingang eines anderen Benutzers erhalten hat. Vielleicht hat der kompromittierte Benutzer seinen Schreibtisch verlassen, um zum Mittagessen zu gehen und hat seine Arbeitsstation nicht gesperrt, oder er hat möglicherweise von einem öffentlichen Terminal aus auf seine E-Mails zugegriffen und sich nicht abgemeldet. In beiden Fällen kann der schändliche Benutzer dieRecoverPassword.aspx
Seite besuchen und den Benutzernamen des Benutzers eingeben. Das System sendet dann das wiederhergestellte Kennwort per E-Mail, ohne zur Sicherheitsantwort aufzufordern. - Umgehen Sie die vom Mitgliedschaftsframework erstellte Abstraktionsebene, und arbeiten Sie direkt mit der SQL Server-Datenbank. Das Mitgliedschaftsschema enthält eine gespeicherte Prozedur mit dem Namen
aspnet_Membership_SetPassword
, die das Kennwort eines Benutzers festlegt und die Sicherheitsantwort oder das alte Kennwort nicht erfordert, um seine Aufgabe auszuführen.
Keine dieser Optionen ist besonders ansprechend, aber so geht das Leben eines Entwicklers manchmal.
Ich ging voran und implementierte den dritten Ansatz, schreiben Code, der die Membership
Und MembershipUser
Klassen umgeht und direkt gegen die SecurityTutorials
Datenbank arbeitet.
Hinweis
Durch direktes Arbeiten mit der Datenbank wird die vom Mitgliedschaftsframework bereitgestellte Kapselung zerbrochen. Diese Entscheidung verbindet uns mit dem SqlMembershipProvider
, was unseren Code weniger portierbar macht. Darüber hinaus funktioniert dieser Code in zukünftigen Versionen von ASP.NET möglicherweise nicht wie erwartet, wenn sich das Mitgliedschaftsschema ändert. Bei diesem Ansatz handelt es sich um eine Problemumgehung und, wie die meisten Problemumgehungen, kein Beispiel für bewährte Methoden.
Der Code hat einige nicht attraktive Bits und ist ziemlich lang. Deshalb möchte ich dieses Lernprogramm nicht mit einer eingehenden Untersuchung überladen. Wenn Sie mehr erfahren möchten, laden Sie den Code für dieses Lernprogramm herunter, und besuchen Sie die ~/Administration/ManageUsers.aspx
Seite. Diese Seite, die wir im vorherigen Lernprogramm erstellt haben, listet jeden Benutzer auf. Ich habe die GridView aktualisiert, um einen Link zur UserInformation.aspx
Seite einzuschließen und den Benutzernamen des ausgewählten Benutzers über die Abfragezeichenfolge zu übergeben. Auf der UserInformation.aspx
Seite werden Informationen zu den ausgewählten Benutzern und TextBoxes zum Ändern ihres Kennworts angezeigt (siehe Abbildung 9).
Nachdem Sie das neue Kennwort eingegeben und im zweiten Textfeld bestätigt und auf die Schaltfläche "Benutzer aktualisieren" geklickt haben, folgt ein Postback, und die aspnet_Membership_SetPassword
gespeicherte Prozedur wird aufgerufen, und das Kennwort des Benutzers wird aktualisiert. Ich ermutige die Leser, die an dieser Funktionalität interessiert sind, sich mit dem Code vertrauter zu machen und die Funktionalität zu erweitern, um das Senden einer E-Mail an den Benutzer einzuschließen, 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 so konfiguriert ist, dass Kennwörter im Klar- oder Hashformat gespeichert werden. Es fehlt der Code zum Verschlüsseln des neuen Kennworts, obwohl Sie eingeladen sind, diese Funktionalität hinzuzufügen. Wie ich empfehlen, den erforderlichen Code hinzuzufügen, besteht darin, einen Dekompilierer wie Reflector zu verwenden, um den Quellcode für Methoden in .NET Framework zu untersuchen. Beginnen Sie, indem Sie die Methode der SqlMembershipProvider
Klasse ChangePassword
untersuchen. Dies ist die Technik, die ich zum Schreiben des Codes zum Erstellen eines Hashs des Kennworts verwendet habe.
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 wird der Benutzer entweder per E-Mail an sein vorhandenes Kennwort oder ein neues, zufällig generiertes Kennwort gesendet. Mit dem ChangePassword-Steuerelement kann ein Benutzer sein Kennwort aktualisieren.
Wie die Steuerelemente "Login" und "CreateUserWizard" rendern die Steuerelemente "PasswordRecovery" und "ChangePassword" eine umfangreiche Benutzeroberfläche, ohne eine Deklarative Markup- oder Codezeile schreiben zu müssen. Wenn die Standardbenutzeroberfläche Ihre Anforderungen nicht erfüllt, können Sie sie über eine Vielzahl von Formateigenschaften anpassen. Alternativ können die Schnittstellen der Steuerelemente in Vorlagen konvertiert werden, um eine noch feinere Steuerung zu ermöglichen. Hinter den Kulissen verwenden diese Steuerelemente die Mitgliedschafts-API, wobei die Methoden und ChangePassword
Methoden des MembershipUser
ResetPassword
Objekts aufgerufen werden.
Glückliche Programmierung!
Weitere nützliche Informationen
Weitere Informationen zu den in diesem Lernprogramm erläuterten Themen finden Sie in den folgenden Ressourcen:
- QuickStarts für ChangePassword-Steuerelement
- PasswordRecovery-Steuerelement – Schnellstarts
- Senden von E-Mails in ASP.NET
System.Net.Mail
Häufig gestellte Fragen
Zum Autor
Scott Mitchell, Autor mehrerer ASP/ASP.NET Bücher und Gründer von 4GuysFromRolla.com, arbeitet seit 1998 mit Microsoft Web Technologies zusammen. Scott arbeitet als unabhängiger Berater, Trainer und Schriftsteller. Sein neuestes Buch ist Sams Teach Yourself ASP.NET 2.0 in 24 Stunden. Scott kann über seinen Blog unter mitchell@4guysfromrolla.com oder über seinen Blog erreicht http://ScottOnWriting.NETwerden.
Besonderer Dank an
Diese Lernprogrammreihe wurde von vielen hilfreichen Prüfern überprüft. Lead reviewers for this tutorial include Michael Emmings and Suchi Banerjee. Möchten Sie meine bevorstehenden MSDN-Artikel überprüfen? Wenn dies der Fall ist, legen Sie mir eine Zeile bei mitchell@4GuysFromRolla.com