復原及變更密碼 (VB)

作者 :Scott Mitchell

注意

自本文撰寫以來,ASP.NET 成員資格提供者已被 ASP.NET 身分識別取代。 強烈建議您更新應用程式以使用 ASP.NET 身分識別 平臺,而不是本文撰寫時精選的成員資格提供者。 ASP.NET 身分識別對於 ASP.NET 成員資格系統有一些優點,包括 :

  • 更好的效能
  • 改善擴充性和可測試性
  • 支援 OAuth、OpenID Connect 和雙因素驗證
  • 宣告型身分識別支援
  • 與 ASP.Net Core 更好的互通性

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

簡介

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

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

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

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

支援使用者帳戶的所有網站都必須為使用者提供一些機制來復原忘記的密碼。 好消息是,在 ASP.NET 中實作這類功能,是一項感謝 PasswordRecovery Web 控制項。 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 以下列三種格式之一儲存使用者的密碼:清除、雜湊 (預設) 或 Encrypted。 使用的儲存機制取決於成員資格組態設定;示範應用程式會使用雜湊密碼格式。 使用雜湊密碼格式時, EnablePasswordRetrieval 選項必須設定為 False,因為系統無法從儲存在資料庫中的雜湊版本判斷使用者的實際密碼。

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

RequiresQuestionAndAnswer、EnablePasswordRetrieval 和 EnablePasswordReset 會影響 PasswordRecovery 控制項的外觀和行為

圖 1RequiresQuestionAndAnswerEnablePasswordRetrievalEnablePasswordReset 影響 PasswordRecovery 控制項的外觀和行為 (按一下即可檢視完整大小的影像)

注意

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

使用 PasswordRecovery 控制項

讓我們看看在 ASP.NET 網頁中使用 PasswordRecovery 控制項。 開啟 RecoverPassword.aspx 並將 PasswordRecovery 控制項從 [工具箱] 拖放到Designer;將其 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.net> 元素放在 元素內 <system.web> ,而是將它放在相同的層級。

<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) ,然後顯示 [成功] 檢視。

使用者已傳送具有新密碼的Email

圖 4:使用者傳送Email,並顯示 [新增密碼] (按一下即可檢視完整大小的影像)

自訂Email

PasswordRecovery 控制項所傳送的預設電子郵件是相當 (請參閱圖 4) 。 訊息會從元素 from 的 屬性中指定的 <smtp> 帳戶傳送,主旨為 Password 和純文字本文:

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

使用者名稱: 使用者名稱

密碼: 密碼

您可以透過 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 提供電子郵件相關屬性的主機,包括 FromCCPrioritySubjectIsBodyHtml 、、 BodyFileName 和其他屬性。 針對入門,請將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,而且主旨和本文已更新。

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

圖 5:主旨、本文和 CC 清單已更新 (按一下即可檢視完整大小的影像)

若要傳送設定 IsBodyHtml 為 True 的 HTML 格式電子郵件, (預設值為 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 用預存程式,並傳入使用者的使用者名稱、新密碼,以及提供的密碼回應,以及其他欄位。 預存程式可確保密碼答案符合,然後更新使用者的密碼。

幾個低階實作注意事項:

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

如何產生隨機密碼的Word

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

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

注意

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

步驟 2:變更密碼

隨機產生的密碼很難記住。 請考慮圖 4 所示的密碼: WWGUZv(f2yM:Bd 。 請嘗試將該認可至記憶體! 不需要說,在使用者傳送這種隨機產生的密碼之後,她想要將密碼變更為更容易記住的密碼。

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

注意

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

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

將 ChangePassword 控制項新增至頁面

圖 6:將 ChangePassword 控制項新增至頁面 (按一下即可檢視完整大小的影像)

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

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

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

注意

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

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

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

圖 7:將 ChangePassword 控制項新增至頁面 (按一下即可檢視完整大小的影像)

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

傳送確認Email

根據預設,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) 。

Email訊息會通知使用者其密碼已變更

圖 8:Email訊息通知使用者其密碼已變更, (按一下即可檢視完整大小的影像)

步驟 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 的預存程式,可設定使用者的密碼,而且不需要安全性答案或舊密碼才能完成其工作。

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

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

注意

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

程式碼有一些不具吸引力的位,而且相當冗長。 因此,我不想用深入的檢查來雜亂本教學課程。 如果您想要深入瞭解,請下載本教學課程的程式碼,並流覽 ~/Administration/ManageUsers.aspx 頁面。 我們在上一個教學課程中建立的 此頁面會列出每個使用者。 我已更新 GridView 以包含頁面的連結 UserInformation.aspx ,並透過 querystring 傳遞選取的使用者名稱。 此頁面 UserInformation.aspx 會顯示所選使用者和 TextBox 的相關資訊,以變更其密碼 (請參閱圖 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 方法。

快樂的程式設計!

深入閱讀

如需本教學課程中討論之主題的詳細資訊,請參閱下列資源:

關於作者

Scott Mitchell 是多個 ASP/ASP.NET 書籍的作者,且 4GuysFromRolla.com 的作者,自 1998 年以來,已與 Microsoft Web 技術合作。 Scott 是獨立顧問、訓練員和作者。 他的最新書籍是 Sams 在 24 小時內自行 ASP.NET 2.0。 您可以在 或 透過在 的 http://ScottOnWriting.NET 部落格連線 mitchell@4guysfromrolla.com 到 Scott。

特別感謝

本教學課程系列是由許多實用的檢閱者檢閱。 本教學課程的潛在客戶檢閱者包括 Michael Emmings 和 Suchi Banerjee。 有興趣檢閱即將推出的 MSDN 文章嗎? 如果是,請將一行放在我 mitchell@4GuysFromRolla.com