[ASP.NET MVC] 前台會員忘記密碼與重設密碼範例 #CH4

[ASP.NET MVC] 前台會員忘記密碼與重設密碼範例教學 #CH4 (附範例下載)

在學習 C# 與資料庫的互動方式,有一個常見且實用的教學就是會員登入、註冊與修改會員資料等範例,學習過程中會用到資料庫新增、修改與查詢動作,是理解程式與資料庫互動的常見程式碼。
當學會了這個範例,將來為客戶開發系統的時候,馬上可以派上用場。

此篇文章是繼上一篇文章: 前台會員修改個人資料範例 #CH3 接續教學。

此範例展示會員忘記密碼時,輸入帳號至後端查詢信箱後,寄送驗證碼至會員信箱,在信件中有連結回網站重設密碼。

範例內容主要以 ASP.NET MVC 為核心,前端使用 Vue.js 框架,而後端使用 SQL Server 當資料庫。

編寫此教學文章是為了幫助更多新加入的軟體工程師們,有更簡單實用的範例,可以快速學習
C# 與資料庫程式語言。
文末有提供此操作範例的完整程式碼下載,有需要可以自行下載瀏覽。

在 MemberController 增加忘記密碼頁面

增加忘記密碼連結

這次會新增一個頁面,所以在「登入」的頁面,增加一個連結,導向「忘記密碼」畫面。
打開 \Views\Member\Login.cshtml 在「登入」按鈕下面增加一個「忘記密碼」連結。

@Html.ActionLink("忘記密碼", "ForgetPwd", "Member")

增加忘記密碼連結

修改後畫面

增加忘記密碼連結

增加忘記密碼頁面

這裡要新增一個忘記密碼的畫面,在 \Controllers\MemberController.cs 類別內,增加 ForgetPwd() 方法然後 Return View()。

增加忘記密碼頁面

增加忘記密碼頁面 View

在 ForgetPwd() 語法上按右鍵選「新增檢視」。

增加忘記密碼頁面 View

選擇「MVC 5 檢視」加入。

選擇「MVC 5 檢視」加入

確認名稱為 “ForgetPwd”,有勾選「使用版面配置頁」。

確認名稱為 “ForgetPwd”,有勾選「使用版面配置頁」

新增之後在 Views\Member\ForgetPwd.cshtml 會新增 View 檢視頁面。

新增之後在 Views\Member\ForgetPwd.cshtml 會新增 View 檢視頁面

編寫「忘記密碼」 View 語法

這個頁面我設計只需要輸入帳號,再點擊「寄送驗證碼」。

在 Bootstrap 3 的官方範例,有提供表單的範例面版的範例按鈕的範例

我從 Bootstrap 3 範例中組合表單 HTML 及套用 Vue.js 語法變成以下的 ForgetPwd.cshtml 程式碼。

修改後畫面

忘記密碼

此頁面重點在按下「寄送驗證碼」後,將前台資料傳送到後端的 ~/Member/SendMailToken 方法,並取得後端的訊息。

我額外增加了 Bootstrap 的 modal 樣式,來顯示後端執行時的錯誤,這樣方便 Debug。

關於 Vue.js 的教學語法,可以到官網上面查詢,官網有完整的教學。

編寫「寄送驗證碼」Controller 語法

當畫面上執行「寄送驗證碼」按鈕,View 會呼叫 MemberController 裡面的SendMailToken() 方法。
以下是 SendMailToken() 寫法。

輸入帳號後,會從資料庫內取得會員的信箱,程式碼會信件到會員信箱。
在信件的連結會導回網站,並夾帶帳號與時間資訊,我將帳號與時間加密後放在驗證碼裡面。
等導回網站時,再解密取出帳號與時間。

在註冊的時候,我並沒有驗證使用者信箱,是因為先講解寫入資料庫就好,驗證信箱的範例,就留到這裡再教學,一次學一點新的東西。
通常在註冊的時候,就會一起驗證信箱是否正常使用,在這裡學到的發信方法,就可以自行應用到註冊那邊去了喔。

調整 Web.config

這次方法使用到了 3DES 加密功能,所以需要設定加密金鑰,我將加密金鑰放在 Web.config 內。
還有 Google 發信的帳號密碼,我也放在 Web.config 內。

在 Web.config 的 <appSettings> 範圍內,新增以下 Key/Value。

<appSettings> 範圍內,新增以下 Key/Value

密鑰為加密使用的鑰匙,相同的資料用不同的鑰匙,就會加密出不同的結果,所以密鑰很重要,需要好好保存。

調整 Google 發信設定

Google 帳號可以借用 Gmail SMTP 發件,可是需要開通一些權限。

開啟此網頁 https://myaccount.google.com/u/1/security,登入身份後,將「允許低安全性應用程式」設為「啟用」。

將「允許低安全性應用程式」設為「啟用」

如果 Google 帳號登入有設定二階段驗證,也需要停用二階段驗證,才可以正常發信。

我這裡為了示範,所以選擇了 Gmail SMTP 來做發信伺服器,開啟「允許低安全性應用程式」會降低帳號的安全性,請確認好會承受的風險再執行。

若為正式發信伺服器,可使用 Google Workspace (舊稱G Suite),或使用企業 SMTP 來發信較適合。

增加忘記密碼 Model

這裡要增加在 Controller 新增的 SendMailTokenIn, SendMailTokenOut 類別。
打開 \Models\MemberModel.cs 檔案,在 MemberModel 裡面增加新的類別。

測試忘記密碼

在 VS 按 <F5> 執行專案,先在「登入」畫面,點「忘記密碼」換頁,輸入帳號後,執行「寄送驗證碼」。
在 Controller 取得帳號後,會查詢資料庫的 Email,然後對 Email 寄出信件。

測試忘記密碼

這是收到信件的畫面,點擊「點此連結」後,就會再導回網站。

測試忘記密碼

回網站後會開啟 /Member/ResetPwd 頁面,這一頁還沒製作,接下來我們就繼續完成這一頁面。

在 MemberController 增加重設密碼頁面

這裡要新增一個重設密碼的畫面,在 \Controllers\MemberController.cs 類別內,增加 ResetPwd() 方法然後 Return View()。

從信件連結回到網頁時,就要先檢查驗證碼是否正確,從驗證碼裡面取得帳號,以及寄件時間,再檢查寄件時間跟現在時間是否超過時效。

檢查成功,將帳號記在 Session 裡面,以方便重設密碼時使用。

增加重設密碼頁面 View

在 ResetPwd() 語法上按右鍵選「新增檢視」。

在 ResetPwd() 語法上按右鍵選「新增檢視」

選擇「MVC 5 檢視」加入。

選擇「MVC 5 檢視」加入

確認名稱為 “ResetPwd”,有勾選「使用版面配置頁」。

確認名稱為 “ResetPwd”,有勾選「使用版面配置頁」

新增之後在 Views\Member\ResetPwd.cshtml 會新增 View 檢視頁面。

新增之後在 Views\Member\ResetPwd.cshtml 會新增 View 檢視頁面

編寫「重設密碼」 View 語法

這個頁面設計重點跟修改個人資料的「修改密碼」是類似的。
我從修改個人資料的「修改密碼」複製一些 View 程式碼來使用,並加上 Vue.js 的語法。

修改後畫面

重設密碼

此頁面重點在按下「重設密碼」後,將前台資料傳送到後端的 ~/Member/DoResetPwd 方法,並取得後端的訊息。

我額外增加了 Bootstrap 的 modal 樣式,來顯示後端執行時的錯誤,這樣方便 Debug。

關於 Vue.js 的教學語法,可以到官網上面查詢,官網有完整的教學。

編寫「重設密碼」Controller 語法

以下是 \Controllers\MemberController.cs 的 DoResetPwd() 寫法。

在傳入的參數中沒有包含帳號,而是從 Session[“ResetPwdUserId”] 取出帳號,是比較安全的做法,把重要的資訊存在 Session 中取用,可以避免前端由駭客傳入假資料,導致修改到別人的密碼。

增加重設密碼 Model

打開 \Models\MemberModel.cs 檔案,在 MemberModel 裡面增加新的類別。

測試忘記密碼與重設密碼功能

在 VS 按 <F5> 執行專案,先在「登入」畫面,點連結到「忘記密碼」畫面。
輸入帳號,按「寄送驗證碼」。

「忘記密碼」畫面

帳號驗證且寄信成功,就會出現訊息。

帳號驗證且寄信成功

在會員的信箱會收到以下的信件。

測試忘記密碼

ResetPwd(string verify) 的方法內會解密驗證碼,就會取得原始資料。

解密驗證碼,就會取得原始資料

解密出帳號及時間,檢查寄件時間跟現在時間是否超過 30 分鐘以上,
如果檢查成功,就將帳號存入 Session 以利重設密碼時使用。

如果檢查成功,就將帳號存入 Session 以利重設密碼時使用

接著在畫面上輸入新密碼及確認新密碼,按下「重設密碼」。

在畫面上輸入新密碼及確認新密碼

畫面出現「重設密碼完成」,就是修改成功了。

重點整理

  1. 增加「忘記密碼」和「重設密碼」兩個頁面
  2. 忘記密碼會發件至會員信箱,再由信箱導連結回網站改密碼
  3. 信件內的連結會帶有帳號及時間資訊,建議轉成加密文字,讓使用者無法修改內容
  4. 從信件連結回網頁需要檢查驗證碼
  5. 重設密碼與之前修改密碼的方法是一樣的

範例下載

想要完整執行此範例可點擊下載: 範例下載

推薦課程

相關學習文章

如果你在學習上有不懂的地方,可以參考線上家教服務

如果你喜歡這篇文章,請幫我在上方綠色的拍手圖示按 5 下
使用 Google 或 FB 免費登入,你的鼓勵支持我繼續創作,寫出好的文章

[加入社團一起討論] 或是 [追蹤 Instagram]

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *