ASP.NET Core 前台會員忘記密碼與重設密碼
在學習 C# 與資料庫的互動方式,有一個常見且實用的教學就是會員登入、註冊與修改會員資料等範例,學習過程中會用到資料庫新增、修改與查詢動作,是理解程式與資料庫互動的常見程式碼。 當學會了這個範例,將來為客戶開發系統的時候,馬上可以派上用場。
此篇文章是繼上一篇文章: 前台會員修改個人資料範例 #CH3 接續教學。 此範例展示會員忘記密碼時,輸入帳號至後端查詢信箱後,寄送驗證碼至會員信箱,在信件中有連結回網站重設密碼。
範例內容主要以 ASP.NET MVC 為核心,前端使用 Vue.js 框架,而後端使用 SQL Server 當資料庫。
編寫此教學文章是為了幫助更多新加入的軟體工程師們,有更簡單實用的範例,可以快速學習 C# 與資料庫程式語言。 文末有提供此操作範例的完整程式碼下載,有需要可以自行下載瀏覽。
目錄
1 在 MemberController 增加忘記密碼頁面 1.1 增加忘記密碼連結 1.2 增加忘記密碼頁面 1.3 增加忘記密碼頁面 View 2 編寫「忘記密碼」 View 語法 3 編寫「寄送驗證碼」Controller 語法 3.1 調整 Web.config 3.2 調整 Google 發信設定 3.3 增加忘記密碼 Model 4 測試忘記密碼 5 在 MemberController 增加重設密碼頁面 5.1 增加重設密碼頁面 View 6 編寫「重設密碼」 View 語法 7 編寫「重設密碼」Controller 語法 7.1 增加重設密碼 Model 8 測試忘記密碼與重設密碼功能 9 重點整理 9.1 範例下載
在 MemberController 增加忘記密碼頁面
增加忘記密碼連結
這次會新增一個頁面,所以在「登入」的頁面,增加一個連結,導向「忘記密碼」畫面。 打開 \Views\Member\Login.cshtml 在「登入」按鈕下面增加一個「忘記密碼」連結。
@Html.ActionLink("忘記密碼", "ForgetPwd", "Member")

修改後畫面

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

增加忘記密碼頁面 View
在 ForgetPwd() 語法上按右鍵選「新增檢視」。

選擇「MVC 5 檢視」加入。

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

新增之後在 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 的 範圍內,新增以下 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 按 執行專案,先在「登入」畫面,點「忘記密碼」換頁,輸入帳號後,執行「寄送驗證碼」。 在 Controller 取得帳號後,會查詢資料庫的 Email,然後對 Email 寄出信件。

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

回網站後會開啟 /Member/ResetPwd 頁面,這一頁還沒製作,接下來我們就繼續完成這一頁面。
在 MemberController 增加重設密碼頁面
這裡要新增一個重設密碼的畫面,在 \Controllers\MemberController.cs 類別內,增加 ResetPwd() 方法然後 Return View()。
從信件連結回到網頁時,就要先檢查驗證碼是否正確,從驗證碼裡面取得帳號,以及寄件時間,再檢查寄件時間跟現在時間是否超過時效。
檢查成功,將帳號記在 Session 裡面,以方便重設密碼時使用。
增加重設密碼頁面 View
在 ResetPwd() 語法上按右鍵選「新增檢視」。

選擇「MVC 5 檢視」加入。

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

新增之後在 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 按 執行專案,先在「登入」畫面,點連結到「忘記密碼」畫面。 輸入帳號,按「寄送驗證碼」。

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

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

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

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

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

畫面出現「重設密碼完成」,就是修改成功了。
重點整理
增加「忘記密碼」和「重設密碼」兩個頁面。
忘記密碼會發件至會員信箱,再由信箱導連結回網站改密碼。
信件內的連結會帶有帳號及時間資訊,建議轉成加密文字,讓使用者無法修改內容。
從信件連結回網頁需要檢查驗證碼。
重設密碼與之前修改密碼的方法是一樣的。
Last updated