Share via


Wiederherstellen und Ändern von Kennwörtern (C#)

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.

RequiresQuestionAndAnswer, EnablePasswordRetrieval und EnablePasswordReset beeinflussen die Darstellung und das Verhalten des PasswordRecovery-Steuerelements

Abbildung 1: Die RequiresQuestionAndAnswerDarstellung EnablePasswordRetrievalund 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 RecoverPwdfest. 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.configangeben. 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 UserNameFailureTextangepasst werden.

Eine Fehlermeldung wird angezeigt, wenn ein ungültiger Benutzername eingegeben wird.

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.

Eine Fehlermeldung wird angezeigt, wenn der Benutzer eine ungültige Sicherheitsantwort eingibt.

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.

Dem Benutzer wird ein Email mit seinem neuen Kennwort gesendet.

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 SendingMailoder 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 void RecoverPwd_SendingMail(object sender, MailMessageEventArgs e)
{
    e.Message.CC.Add("webmaster@example.com");
}

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, SubjectIsBodyHtml, 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 EmailTemplatesauf 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.

Betreff, Text und CC-Liste wurden aktualisiert.

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, wenn RequiresQuestionAndAnswer false ist.
  • ResetPassword(securityAnswer) : Setzt das Kennwort eines Benutzers nur zurück, wenn die angegebene securityAnswer korrekt ist. Verwenden Sie diese Überladung, wenn RequiresQuestionAndAnswer 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 GeneratePassworderstellt. 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 ChangePwdhinzu. 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.

Hinzufügen eines ChangePassword-Steuerelements zur Seite

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.aspxvon 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).

Eine Fehlermeldung wird angezeigt, wenn Sie ein neues Kennwort eingeben, das die Anforderungen für Kennwortlänge und nicht alphanumerische Zeichen nicht erfüllt.

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 BodyFileNamedie Eigenschaften , IsBodyHtmlund Subject des 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).

Eine Email-Nachricht informiert den Benutzer darüber, dass sein Kennwort geändert wurde.

Abbildung 8: Eine Email Meldung 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 von Benutzerkennwörtern durch Administratoren

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, weil 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 PasswordRecovery- und ChangePassword-Steuerelementen müssen sich Administrative Benutzer jedoch nicht selbst mit dem Ändern der Benutzerkennwörter beschäftigen, da Benutzer dies selbst tun können.

Was aber, wenn Ihr Client darauf besteht, dass Administratorbenutzer in der Lage sein sollten, die Kennwörter anderer Benutzer zu ändern? 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 MembershipUser -Methode des ChangePassword Objekts 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 zum Benutzernamen. Dabei handelt es sich um den 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 resetPwdgespeichert. Nachdem wir nun 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 Konfiguration des Mitgliedschaftssystems 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 Möglichkeiten:

  • Werfen Sie Ihre Hände in die Luft und sagen Sie Ihrem Kunden, dass dies nur eine Sache ist, die nicht getan werden kann.
  • Legen Sie auf False fest RequiresQuestionAndAnswer . Dies führt zu einer weniger sicheren Anwendung. Stellen Sie sich vor, ein böswilliger 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 von einem öffentlichen Terminal aus auf seine E-Mails zugegriffen und sich nicht abgemeldet. In beiden Fällen kann der böswillige Benutzer die RecoverPassword.aspx Seite besuchen und den Benutzernamen des Benutzers eingeben. Das System sendet dann eine E-Mail mit dem wiederhergestellten Kennwort, ohne zur Eingabe der 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 namens aspnet_Membership_SetPassword , die das Kennwort eines Benutzers festlegt und keine Sicherheitsantwort oder ein altes Kennwort benötigt, 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 und Code geschrieben, der die Membership Klassen und MembershipUser 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 SqlMembershipProviderund macht unseren Code weniger portierbar. Darüber hinaus funktioniert dieser Code in zukünftigen Versionen von ASP.NET möglicherweise nicht wie erwartet, wenn sich das Mitgliedschaftsschema ändert. Dieser Ansatz ist eine Problemumgehung und, 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 gridView aktualisiert, um einen Link zur Seite einzuschließen UserInformation.aspx , wobei der Benutzername des ausgewählten Benutzers über die Abfragezeichenfolge übergeben wird. Auf UserInformation.aspx der Seite werden Informationen zum ausgewählten Benutzer und TextBoxes zum Ändern des Kennworts angezeigt (siehe Abbildung 9).

Nachdem Sie das neue Kennwort eingegeben, im zweiten Textfeld bestätigt und auf die Schaltfläche Benutzer aktualisieren geklickt haben, wird ein Postback ausgeführt, und die aspnet_Membership_SetPassword gespeicherte Prozedur wird aufgerufen, wodurch das Kennwort des Benutzers aktualisiert wird. Ich ermutige die Leser, die an dieser Funktionalität interessiert sind, sich mit dem Code vertraut zu machen und zu versuchen, die Funktionalität um das Senden einer E-Mail an den Benutzer zu erweitern, dessen Kennwort geändert wurde.

Ein Administrator kann das Kennwort eines Benutzers ändern.

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 Clear- oder Hashed-Format gespeichert werden. Es fehlt der Code zum Verschlüsseln des neuen Kennworts, obwohl Sie aufgefordert werden, diese Funktionalität hinzuzufügen. Die Möglichkeit, den erforderlichen Code hinzuzufügen, besteht darin, einen Dekompilierer wie Reflector zu verwenden, um den Quellcode auf Methoden im .NET Framework zu untersuchen. Beginnen Sie mit der Untersuchung der -Methode der SqlMembershipProviderChangePassword Klasse. Dies ist die Technik, mit der ich den Code zum Erstellen eines Hashs des Kennworts geschrieben 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 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 Login- und CreateUserWizard-Steuerelemente rendern die Steuerelemente PasswordRecovery und ChangePassword eine umfassende Benutzeroberfläche, ohne ein Lick des deklarativen Markups oder der Codezeile schreiben zu müssen. Wenn die Standard-Benutzeroberfläche Nicht Ihren Anforderungen entspricht, können Sie sie über eine Vielzahl von Stileigenschaften anpassen. Alternativ können die Schnittstellen der Steuerelemente für einen noch feineren Grad der Steuerung in Vorlagen konvertiert werden. Im Hintergrund verwenden diese Steuerelemente die Mitgliedschafts-API, wobei die Methoden und ChangePassword des MembershipUserResetPassword Objekts aufgerufen werden.

Viel Spaß beim Programmieren!

Weitere Informationen

Weitere Informationen zu den in diesem Tutorial behandelten 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 Hours. Scott kann unter mitchell@4guysfromrolla.com oder über seinen Blog unter http://ScottOnWriting.NETerreicht werden.

Besonderer 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 bevorstehenden MSDN-Artikel lesen? Wenn dies der Fall ist, legen Sie eine Zeile unter mitchell@4GuysFromRolla.com