共用方式為


復原及變更密碼 (VB)

作者:Scott Mitchell

注意

自本文撰寫以來,ASP.NET 成員資格提供者已由 ASP.NET Identity 取代。 我們強烈建議更新應用程式以使用 ASP.NET Identity 平台,而不是撰寫本文時介紹的成員資格提供者。 與 ASP.NET 成員資格系統相比,ASP.NET Identity 具有許多優勢,包括:

  • 更好的效能
  • 改進的可擴展性和可測試性
  • 支援 OAuth、OpenID Connect 和雙重認證
  • 基於宣告的身分支援
  • 與 ASP.Net Core 更好的互通性

ASP.NET 包含兩個 Web 控制件,可協助復原和變更密碼。 PasswordRecovery 控件可讓訪客復原遺失的密碼。 ChangePassword 控件可讓使用者更新其密碼。 如同我們在本教學課程系列中看到的其他登入相關 Web 控件,PasswordRecovery 和 ChangePassword 控件會與幕後的成員資格架構搭配運作,以重設或修改使用者的密碼。

簡介

在我銀行、公用程式公司、電話公司、電子郵件帳戶和個人化入口網站的網站之間,我和大多數人一樣,有數十個不同的密碼要記住。 使用這麼多認證來記住這些天,人們忘記密碼並不罕見。 若要考慮這個問題,提供使用者帳戶的網站必須包含用戶復原其密碼的方式。 此程式通常牽涉到產生新的隨機密碼,並將電子郵件傳送給檔案上的使用者電子郵件位址。 在收到新密碼之後,大部分的用戶都會返回網站,並將密碼從隨機產生的密碼變更為更令人難忘的密碼。

ASP.NET 包含兩個 Web 控制件,可協助復原和變更密碼。 PasswordRecovery 控件可讓訪客復原遺失的密碼。 ChangePassword 控件可讓使用者更新其密碼。 如同我們在本教學課程系列中看到的其他登入相關 Web 控件,PasswordRecovery 和 ChangePassword 控件會與幕後的成員資格架構搭配運作,以重設或修改使用者的密碼。

在本教學課程中,我們將檢查這兩個控件。 我們也會瞭解如何透過 MembershipUser 類別的 ChangePasswordResetPassword 方法,以程式設計方式變更和重設用戶的密碼。

步驟 1:協助用戶復原遺失的密碼

支援用戶帳戶的所有網站都需要為使用者提供一些機制來復原他們忘記的密碼。 好消息是,由於PasswordRecovery Web控件,在 ASP.NET 中實作這類功能是微風。 PasswordRecovery 控件會轉譯介面,提示使用者輸入其用戶名稱,並視需要回答其安全性問題。 然後,它會傳送電子郵件給使用者他們的密碼。

注意

由於電子郵件訊息是透過純文本透過網路傳輸,因此透過電子郵件傳送用戶密碼時,有安全性風險。

PasswordRecovery 控件包含三個檢視:

  • UserName - 提示訪客輸入其用戶名稱。 這是初始檢視。
  • 問題 - 將使用者的使用者名稱和安全性問題顯示為文字,以及讓使用者輸入安全性問題的答案的 TextBox。
  • 成功 - 顯示一則訊息,告知使用者密碼已傳送電子郵件給使用者。

PasswordRecovery 控件所顯示的檢視和動作取決於下列成員資格組態設定:

  • RequiresQuestionAndAnswer
  • EnablePasswordRetrieval
  • EnablePasswordReset

成員資格架構的 RequiresQuestionAndAnswer 設定指出使用者在註冊帳戶時,是否必須指定安全性問題和答案。 如同我們在建立使用者帳戶教學課程中所討論的,如果 RequiresQuestionAndAnswer 為 True(預設值),則 CreateUserWizard 的介面會包含新使用者安全性問題和答案的 TextBox 控件;如果 RequiresQuestionAndAnswer 為 False,則不會收集這類資訊。 同樣地,如果 RequiresQuestionAndAnswer 為 True,則 PasswordRecovery 控件會在使用者輸入使用者名稱之後顯示 [問題] 檢視;只有在使用者輸入正確的安全性答案時,才會復原密碼。 不過,如果 RequiresQuestionAndAnswer 為 False,則 PasswordRecovery 控件會從 UserName 檢視直接移至 [成功] 檢視。

在使用者提供使用者名稱或使用者名稱和安全性答案之後,如果 RequiresQuestionAndAnswer 為 True ,PasswordRecovery 就會將密碼傳送給使用者。 EnablePasswordRetrieval如果選項設定為 True,則會以電子郵件傳送使用者目前的密碼。 如果它設定為 False 且 EnablePasswordReset 設定為 True,則 PasswordRecovery 控件會為用戶產生新的隨機密碼,並將這個新密碼傳送給使用者。 如果 和 EnablePasswordReset 都是 EnablePasswordRetrieval False,PasswordRecovery 控件會擲回例外狀況。

注意

回想一下,會將 SqlMembershipProvider 使用者的密碼儲存為三種格式之一:Clear、Hashed (預設值),或 Encrypted。 所使用的儲存機制取決於成員資格組態設定;示範應用程式使用哈希密碼格式。 使用哈希密碼格式時, EnablePasswordRetrieval 選項必須設定為 False,因為系統無法從儲存在資料庫中的哈希版本判斷使用者的實際密碼。

圖 1 說明 PasswordRecovery 的介面和行為如何受到成員資格設定的影響。

RequiresQuestionAndAnswer、EnablePasswordRetrieval 和 EnablePasswordReset 影響 PasswordRecovery 控件的外觀和行為

圖 1RequiresQuestionAndAnswerEnablePasswordRetrieval、 和 EnablePasswordReset 影響 PasswordRecovery 控件的外觀和行為 (按兩下以檢視完整大小的影像

注意

在 [在 SQL Server 中建立成員資格架構] 教學課程中,我們會將 [成員資格提供者] 設定為 [True]、EnablePasswordRetrieval[RequiresQuestionAndAnswerFalse] 和 EnablePasswordReset [True]。

使用 PasswordRecovery 控制件

讓我們看看在 ASP.NET 頁面中使用PasswordRecovery控件。 開啟 RecoverPassword.aspx 並拖放 [工具箱] 中的 PasswordRecovery 控制件至設計工具;將其 ID 設定為 RecoverPwd。 如同 Login 和 CreateUserWizard Web 控件,PasswordRecovery 控件的檢視會轉譯包含標籤、TextBoxes、Buttons 和驗證控件的豐富複合介面。 您可以透過控件的樣式屬性或將檢視轉換成範本,自定義檢視的外觀。 我將其作為練習留給有興趣的讀者。

當使用者瀏覽此頁面時,她將會輸入使用者名稱,然後按下 [提交] 按鈕。 因為我們已在成員資格組態設定中將 RequiresQuestionAndAnswer 屬性設定為 True,因此 PasswordRecovery 控件接著會顯示 [問題] 檢視。 當使用者輸入正確的安全性答案並按兩下 [提交] 之後,PasswordRecovery 控件會將使用者的密碼更新為隨機產生的密碼,並將此密碼傳送至檔案上的電子郵件位址。 這一切是可能的,我們不必撰寫單行程序代碼!

在測試此頁面之前,有一個最後一個組態要傾向於:我們需要在 中 Web.config指定郵件傳遞設定。 PasswordRecovery 控件依賴這些設定來傳送電子郵件。

郵件傳遞組態是透過 <system.net> 元素的 元素<mailSettings>指定。 <smtp>使用 元素來指出傳遞方法和預設的From位址。 下列標記會設定郵件設定,以使用埠 25 上名為 smtp.example.com 的網路 SMTP 伺服器,以及使用者名稱和密碼的使用者名稱/密碼認證。

注意

<system.net> 是根 <configuration> 元素的子專案和的 <system.web>同層級。 因此,請勿將專案放在 元素內<system.web>,而是將其放在<system.net>相同的層級。

<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>

除了在網路上使用 SMTP 伺服器之外,您也可以指定要傳送電子郵件訊息的取貨目錄。

設定 SMTP 設定之後,請透過瀏覽器瀏覽 RecoverPassword.aspx 頁面。 首先,請嘗試輸入使用者存放區中不存在的用戶名稱。 如圖 2 所示,PasswordRecovery 控件會顯示訊息,指出無法存取用戶資訊。 訊息的文字可以透過控件的 UserNameFailureText 屬性來自定義。

如果輸入無效的用戶名稱,則會顯示錯誤訊息

圖 2:如果輸入無效的用戶名稱,就會顯示錯誤訊息(按兩下以檢視完整大小的影像

現在輸入用戶名稱。 使用系統中帳戶的用戶名稱,以及您可以存取的電子郵件位址,以及您知道其安全性答案。 輸入使用者名稱並按兩下 [提交] 之後,PasswordRecovery 控件會顯示其 [問題] 檢視。 如同 UserName 檢視,如果您輸入不正確的答案,PasswordRecovery 控件會顯示錯誤訊息(請參閱圖 3)。 QuestionFailureText使用屬性來自定義此錯誤訊息。

如果使用者輸入無效的安全性答案,就會顯示錯誤訊息

圖 3:如果使用者輸入無效的安全性答案,就會顯示錯誤訊息(按兩下以檢視完整大小的影像

最後,輸入正確的安全性答案,然後按兩下 [提交]。 在幕後,PasswordRecovery 控件會產生隨機密碼、將它指派給使用者帳戶、傳送電子郵件通知使用者他們的新密碼(請參閱圖 4),然後顯示 [成功] 檢視。

用戶會傳送含有新密碼的電子郵件

圖 4:使用者以新密碼傳送電子郵件(按兩下以檢視完整大小的影像

自訂電子郵件

PasswordRecovery 控件所傳送的預設電子郵件相當沉悶(請參閱圖 4)。 訊息會從元素from的 屬性中指定的<smtp>帳戶傳送,其中包含主旨密碼和純文本本文:

請使用下列資訊返回網站並登入。

用戶名稱: 用戶名稱

密碼: 密碼

您可以透過 PasswordRecovery 控制件事件的SendingMail事件處理程式,或透過 MailDefinition 屬性以宣告方式自定義此訊息。 讓我們探索這兩個選項。

事件 SendingMail 會在傳送電子郵件訊息之前立即引發,這是我們最後一次以程式設計方式調整電子郵件訊息的機會。 引發此事件時,事件處理程式會傳遞類型 MailMessageEventArgs的物件,其 Message 屬性包含即將傳送之電子郵件的參考。

建立 事件的事件處理程式, SendingMail 並新增下列程序代碼,以程式設計方式新增 webmaster@example.com 至CC清單。

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

您也可以透過宣告式方式設定電子郵件訊息。 PasswordRecovery 的 MailDefinition 屬性是 類型的 MailDefinition物件。 類別MailDefinition提供許多電子郵件相關屬性,包括From、、CC、、PrioritySubjectIsBodyHtmlBodyFileName等。 對於入門版,請將 Subject 屬性 設定為比預設所使用的屬性更具描述性的內容(密碼),例如您的密碼已重設...

若要自定義電子郵件訊息的本文,我們需要建立包含本文內容的個別電子郵件範本檔案。 從在名為 EmailTemplates的網站中建立新資料夾開始。 接下來,將新的文本檔新增至名為 PasswordRecovery.txt 的資料夾,並新增下列內容:

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!

請注意佔位元 <%UserName%><%Password%>的用法。 PasswordRecovery 控件會自動以用戶的使用者名稱取代這兩個佔位元元,並在傳送電子郵件之前復原密碼。

最後,將MailDefinitionBodyFileName屬性指向我們剛才建立的電子郵件範本(~/EmailTemplates/PasswordRecovery.txt)。

進行這些變更之後, RecoverPassword.aspx 請重新瀏覽頁面,並輸入您的使用者名稱和安全性答案。 您應該會收到類似圖 5 中電子郵件的電子郵件。 請注意, webmaster@example.com 已是 CC'd,且主旨和本文已更新。

已更新主旨、本文和CC清單

圖 5:主旨、本文和副本清單已更新 (按兩下以檢視完整大小的影像

若要將 HTML 格式的電子郵件設定 IsBodyHtml 為 True(預設值為 False),並更新電子郵件範本以包含 HTML。

屬性 MailDefinition 不是唯一的PasswordRecovery類別。 如我們在步驟 2 中所見,ChangePassword 控件也提供 MailDefinition 屬性。 此外,CreateUserWizard 控制項包含這類屬性,可讓您設定為自動將歡迎電子郵件訊息傳送給新使用者。

注意

目前左側導覽中沒有連結可連線到 RecoverPassword.aspx 頁面。 如果用戶無法成功登入網站,則使用者才有興趣瀏覽此頁面。 因此,更新 Login.aspx 頁面以包含頁面的連結 RecoverPassword.aspx

以程式設計方式重設用戶的密碼

重設用戶的密碼時,PasswordRecovery 控件會呼叫 MembershipUser 物件的 ResetPassword 方法。 這個方法有兩個多載:

  • ResetPassword - 重設用戶的密碼。 如果 RequiresQuestionAndAnswer 為 False,請使用此多載。
  • ResetPassword(securityAnswer) - 只有在提供的 securityAnswer 正確時,才會重設用戶的密碼。 如果 RequiresQuestionAndAnswer 為 True,請使用這個多載。

這兩個多載都會傳回新的隨機產生的密碼。

如同成員資格架構中的其他方法,方法 ResetPassword 會委派給設定的提供者。 會 SqlMembershipProvideraspnet_Membership_ResetPassword 用預存程式、傳入使用者的用戶名稱、新密碼,以及提供的密碼回應,以及其他欄位。 預存程式可確保密碼回應符合,然後更新用戶的密碼。

幾個低階實作注意事項:

  • 鎖定的用戶無法重設其密碼。 不過,未經核准的使用者可能會。 我們將在解除鎖定和核准用戶帳戶教學課程中更詳細地討論鎖定和核准的狀態。
  • 如果密碼答案不正確,則用戶的失敗密碼答案嘗試計數會遞增。 如果指定的安全性響應嘗試數目在指定的時間範圍內發生,則會鎖定使用者。

文字,說明如何產生隨機密碼

圖 4 和 5 中電子郵件訊息中顯示的隨機產生的密碼是由 Membership 類別的 GeneratePassword 方法所建立。 這個方法接受兩個整數輸入參數 - length 和 numberOfNonAlphanumericCharacters - 並傳回長度至少為長度的字符串,長度至少為 numberOfNonAlphanumericCharacters 數目的非英數位元。 從 Membership 類別或 Login 相關 Web 控件內呼叫這個方法時,這兩個參數的值會分別由成員資格組態的 MinRequiredPasswordLength 和 屬性決定,而我們設定為 7 和 MinRequiredNonalphanumericCharacters 1。

方法 GeneratePassword 會使用密碼編譯強隨機數產生器,以確保選取的隨機字元沒有任何偏差。 此外, GeneratePasswordPublic,這表示如果您需要產生隨機字串或密碼,可以直接從 ASP.NET 應用程式使用它。

注意

類別 SqlMembershipProvider 一律會產生至少 14 個字元的隨機密碼,因此如果 MinRequiredPasswordLength 小於 14,則會忽略其值。

步驟 2:變更密碼

隨機產生的密碼難以記住。 請考慮圖 4 所示的密碼: WWGUZv(f2yM:Bd。 請嘗試將它認可至記憶體! 不用說,在用戶傳送這種隨機產生的密碼之後,她會想要將密碼變更為更令人難忘的密碼。

使用 ChangePassword 控制項建立介面,讓使用者變更其密碼。 與 PasswordRecovery 控制件類似,ChangePassword 控件包含兩個檢視:變更密碼和成功。 [變更密碼] 檢視會提示使用者輸入其舊密碼和新密碼。 提供正確的舊密碼和新密碼,以符合長度下限和非英數位元需求時,ChangePassword 控件會更新用戶的密碼,並顯示 [成功] 檢視。

注意

ChangePassword 控制項會叫用 MembershipUser 物件的 ChangePassword 方法來修改使用者的密碼。 ChangePassword 方法接受兩個String輸入參數 - oldPassword 和 newPassword -, 並使用 newPassword 更新使用者的帳戶,假設提供的 oldPassword 正確。

開啟頁面並將 ChangePassword.aspx ChangePassword 控制項新增至頁面,並將它命名為 ChangePwd。 此時,[設計] 檢視應該會顯示 [變更密碼] 檢視(請參閱圖 6)。 如同 PasswordRecovery 控制件,您可以透過控件的智慧標記在檢視之間切換。 此外,這些檢視的外觀可透過各種樣式屬性或將它們轉換成範本來自定義。

將 ChangePassword 控件新增至頁面

圖 6:將 ChangePassword 控件新增至頁面 (按兩下以檢視完整大小的影像

ChangePassword 控制項可以更新目前登入的用戶密碼 另一個指定用戶的密碼。 如圖 6 所示,預設的 [變更密碼] 檢視只會轉譯三個 TextBox 控制件:一個用於舊密碼,另一個用於新密碼。 此預設介面可用來更新目前登入的用戶密碼。

若要使用 ChangePassword 控制項來更新其他使用者的密碼,請將控件的 DisplayUserName 屬性 設定為 True。 這麼做會將第四個 TextBox 新增至頁面,並提示您輸入要變更其密碼的用戶名稱。

如果您想要讓註銷的使用者變更密碼而不需登入,則設定 DisplayUserName 為 True 會很有用。 就個人而言,我認為在允許她變更密碼之前,要求使用者登入沒有任何問題。 因此,將 設定 DisplayUserName 為 False (預設值)。 不過,在做出此決定時,我們基本上禁止匿名用戶連線到此頁面。 更新網站的網址授權規則,以拒絕匿名使用者流覽 ChangePassword.aspx。 如果您需要重新整理 URL 授權規則語法上的記憶體,請參閱 以用戶為基礎的授權 教學課程。

注意

屬性似乎 DisplayUserName 很適合讓系統管理員變更其他用戶的密碼。 不過,即使 DisplayUserName 設定為 True,也必須知道並輸入正確的舊密碼。 我們將討論允許系統管理員在步驟 3 中變更使用者密碼的技術。

ChangePassword.aspx透過瀏覽器瀏覽頁面並變更您的密碼。 請注意,如果您輸入不符合成員資格設定中指定的密碼長度和非英數位元需求的新密碼,就會顯示錯誤訊息(請參閱圖 7)。

如果您輸入不符合密碼長度和非英數位元需求的新密碼,就會顯示錯誤訊息。

圖 7:將 ChangePassword 控件新增至頁面 (按兩下以檢視完整大小的影像

輸入正確的舊密碼和有效的新密碼時,登入的使用者密碼會變更,並顯示 [成功] 檢視。

傳送確認電子郵件

根據預設,ChangePassword 控制件不會傳送電子郵件訊息給剛更新密碼的使用者。 如果您想要傳送電子郵件,只要設定控件的 MailDefinition 屬性即可。 讓我們設定 ChangePassword 控制項,讓使用者傳送 HTML 格式的電子郵件,其中包含其新密碼。

首先,在名為ChangePassword.htmEmailTemplates 資料夾中建立新的檔案。 新增下列標記:

<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>

接下來,將 ChangePassword 控制件的 MailDefinitionBodyFileNameIsBodyHtmlSubject 屬性分別設定為 ~/EmailTemplates/ChangePassword.htm、True 和您的密碼!。

進行這些變更之後,請重新瀏覽頁面並再次變更您的密碼。 這次,ChangePassword 控件會將自定義的 HTML 格式電子郵件傳送至檔案上的使用者電子郵件位址(請參閱圖 8)。

電子郵件訊息會通知使用者其密碼已變更

圖 8:電子郵件訊息通知使用者密碼已變更(按一下以檢視完整大小的影像

步驟 3:允許系統管理員變更用戶的密碼

支援使用者帳戶的應用程式中常見的功能是系統管理用戶能夠變更其他用戶的密碼。 有時候需要這項功能,因為系統缺少用戶變更自己的密碼的能力。 在這種情況下,用戶復原忘記密碼的唯一方式是系統管理員為其指派新密碼。 不過,使用PasswordRecovery和 ChangePassword 控件,系統管理使用者不需要忙於變更使用者的密碼,因為用戶能夠自行執行這項操作。

但是,如果您的用戶端堅持系統管理使用者應該能夠變更其他用戶的密碼,該怎麼辦? 不幸的是,新增這項功能可能有點工作。 若要變更使用者的密碼,必須同時提供舊密碼和新密碼給 MembershipUser 物件的 ChangePassword 方法,但系統管理員不應該知道用戶的密碼才能修改密碼。

其中一個因應措施是先重設使用者的密碼,然後使用如下的程式代碼將其變更為新的密碼:

Dim usr As MembershipUser = Membership.GetUser(username)
Dim resetPwd As String = usr.ResetPassword()
usr.ChangePassword(resetPwd, newPassword)

此程式代碼一開始會擷取使用者名稱的相關信息,也就是系統管理員想要變更其密碼的使用者。 接下來, ResetPassword 會叫用 方法,以指派和使用者新的隨機密碼。 這個隨機產生的密碼是由 方法傳回,並儲存在變數 resetPwd中。 既然我們知道使用者的密碼,我們可以透過對的呼叫 ChangePassword加以變更。

問題是,只有當成員資格系統設定設為 RequiresQuestionAndAnswer False 時,此程式代碼才有效。 如果 RequiresQuestionAndAnswer 為 True,如同我們的應用程式,則 ResetPassword 方法必須傳遞安全性答案,否則會擲回例外狀況。

如果成員資格架構設定為需要安全性問題和答案,但您的用戶端堅持系統管理員能夠變更用戶的密碼,您有三個選項:

  • 把手扔在空中,告訴用戶端,這隻是一件事,無法完成。
  • 設定 RequiresQuestionAndAnswer 為 False。 這會導致較不安全的應用程式。 想像一下,惡意的使用者已取得其他使用者電子郵件收件匣的存取權。 也許遭入侵的用戶已經離開辦公桌去午餐,沒有鎖定他們的工作站,或者他們可能從公用終端機存取他們的電子郵件,也沒有註銷。不論是哪一種情況,惡意的使用者都可以瀏覽 RecoverPassword.aspx 頁面並輸入用戶的用戶名稱。 系統接著會以電子郵件傳送已復原的密碼,而不會提示提供安全性答案。
  • 略過成員資格架構所建立的抽象層,並直接使用 SQL Server 資料庫。 成員資格架構包含名為 aspnet_Membership_SetPassword 的預存程式,可設定用戶的密碼,且不需要安全性回應或舊密碼才能完成其工作。

這些選項都沒有特別吸引人,但這就是開發人員的生命週期。

我繼續進行並實作第三種方法,撰寫略 Membership 過 和 MembershipUser 類別的程序代碼,並直接針對 SecurityTutorials 資料庫操作。

注意

藉由直接使用資料庫,會粉碎成員資格架構所提供的封裝。 此決策會將我們系結至 SqlMembershipProvider,使得我們的程式代碼更容易移植。 此外,如果成員資格架構變更,此程式代碼在未來版本的 ASP.NET 可能無法如預期般運作。 此方法是因應措施,而且與大部分因應措施一樣,不是最佳做法的範例。

程序代碼有一些不具吸引力的位,而且相當冗長。 因此,我不想將本教學課程與深入的檢查雜亂無章。 如果您有興趣深入瞭解,請下載本教學課程的程式代碼並瀏覽 ~/Administration/ManageUsers.aspx 頁面。 我們在上一個教學課程中建立的此頁面會列出每個使用者。 我已更新 GridView 以包含頁面的連結 UserInformation.aspx ,並透過 querystring 傳遞選取的用戶名稱。 此頁面 UserInformation.aspx 會顯示所選使用者和 TextBoxes 變更其密碼的相關信息(請參閱圖 9)。

輸入新密碼之後,在第二個 TextBox 中確認密碼,然後按兩下 [更新使用者按鈕]、後續回傳和 aspnet_Membership_SetPassword 叫用預存程式、更新用戶的密碼。 我鼓勵那些對此功能感興趣的讀者更熟悉程序代碼,並嘗試擴充功能,以包含傳送電子郵件給密碼已變更的使用者。

系統管理員可能會變更用戶的密碼

圖 9:系統管理員可能會變更使用者的密碼(按一下以檢視完整大小的映像

注意

UserInformation.aspx目前只有在成員資格架構設定為以 Clear 或 Hashed 格式儲存密碼時,頁面才能運作。 雖然您受邀新增此功能,但缺少加密新密碼的程序代碼。 建議新增必要程序代碼的方式是使用 Reflector 之類的反編譯程式來檢查 .NET Framework 中方法的原始程式碼;首先檢查 SqlMembershipProvider 類別的 ChangePassword 方法。 這是我用來撰寫程式代碼以建立密碼哈希的技術。

摘要

ASP.NET 提供兩個控件來協助使用者管理其密碼。 PasswordRecovery 控件對於忘記密碼的人來說很有用。 根據成員資格架構的組態,用戶會以電子郵件傳送其現有密碼或新的隨機產生的密碼。 ChangePassword 控件可讓使用者更新其密碼。

如同 Login 和 CreateUserWizard 控件,PasswordRecovery 和 ChangePassword 控件會轉譯豐富的使用者介面,而不需要撰寫宣告式標記或程式代碼行。 如果預設使用者介面不符合您的需求,您可以透過各種樣式屬性加以自定義。 或者,控件的介面可能會轉換成範本,以取得更精細的控制程度。 在幕後,這些控件會使用成員資格 API,叫用 MembershipUser 物件的 ResetPasswordChangePassword 方法。

快樂程式!

深入閱讀

有關本教學課程中討論的主題的更多資訊,請參閱以下資源:

關於作者

斯科特·米切爾,多個 ASP/ASP.NET 書籍的作者,4GuysFromRolla.com 的創始人,自1998年以來一直與Microsoft Web 技術合作。 Scott 擔任獨立顧問、講師和作家。 他的新書是 Sams Teach Yourself ASP.NET 2.0 in 24 Hours。 斯科特可以透過 mitchell@4guysfromrolla.com 他在的部落格聯繫到或通過他的博客 http://ScottOnWriting.NET

特別感謝

本教學課程系列已經過許多熱心的檢閱者檢閱。 本教學課程的主要檢閱者包括 Michael Emmings 和 Suchi Banerjee。 有興趣檢閱我即將推出的 MSDN 文章嗎? 如果是,請將一行放在 mitchell@4GuysFromRolla.com