[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() 寫法。

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

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

調整 Google 發信設定

在使用系統發信的設定,建議先使用企業內部的發信伺服器,或是使用 Google Workspace (舊稱G Suite) 的服務來發信,讓收信的客戶感受到正式的發信來源。

這裡範例我會以免費的 Google STMP 發信做講解,Google 在 2022/5/30 已停用了「低安全性應用程式存取權」的機制,不能像過去允許低安全性存取就可以發信了,現在調高了安全性設定。

現在要透過 Google 免費發信,需要先開啟「兩步驟驗證」以及「應用程式密碼」才可以,開啟網頁 https://myaccount.google.com/u/0/security 在個人 Google 帳戶要先開啟「兩步驟驗證」,然後點擊「應用程式密碼」。

調整 Google 發信設定 

在「選取應用程式」選擇「郵件」,在「選取裝置」可選擇「其他」。

調整 Google 發信設定 

然後輸入自訂的名稱。

調整 Google 發信設定 

按下「產生」後就會產生一組「應用程式密碼」,此密碼會取代發信時個人 Gmail 帳號的密碼。

取代發信時個人 Gmail 帳號的密碼

此密碼可以記下來,接著程式會用到。

調整 Web.config

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

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

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

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

Google 發信密碼就用剛剛得到的「應用程式密碼」喔,而不是平常登入 Google 的密碼。

增加忘記密碼 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. 重設密碼與之前修改密碼的方法是一樣的

範例下載

此範例包含完整範例內容,連結 GitHub 下載範例

下一篇教學文章

相關學習文章

如果你在學習上有不懂的地方,需要諮詢服務,可以參考站長服務,我想辨法解決你的問題
如果文章內容有過時、不適用或錯誤的地方,幫我在下方留言通知我一下,謝謝

加入社團一起討論

關注我的 IG

5 thoughts on “[ASP.NET MVC] 前台會員忘記密碼與重設密碼範例教學 #CH4

  1. 不好意思,想請問一下,目前遇到的問題是
    “System.Net.Mail.SmtpException: ‘SMTP 伺服器需要安全連接,或用戶端未經驗證。 伺服器回應為: 5.7.0 Authentication Required. Learn more at”
    好像原因是因為沒有開啟低安全性應用程式存取權,然而正當我要去開啟次功能時,發現Google從今年5月30日起已經停用這個功能了,想請教一下是否有替代的解決方式,謝謝!

  2. 您好,我做到“測試忘記密碼”的部分的時候,執行會出現“需要的反仿冒表單欄位”__RequestVerificationToken”不存在。”的這個錯誤,google不到相關的解答…希望能請您協助

    1. 因為此目的是安全性檢查,確保是由 View 向後端傳送的資料,你在 View 的 ajax 的 data 要傳給後端時,少了以下語法
      __RequestVerificationToken: self.GetToken()

  3. 您好,我最近開始學習mvc,跟著您的教學來到上一章,看到留言得知您為了教學的更清楚易懂,所以在Coding上有一些取捨,不知道是否可以另外出一個在實務上Coding方式的程式碼呢?

    單純展示程式碼或是放一個檔案提供下載,不需要多做解釋,讓新手可以自己去學習實務上的寫法,謝謝。

Comments are closed.