前言
MFA(多因素驗證)是提升帳號安全性的重要手段,能有效防止因密碼洩漏而導致的未授權存取。然而,在 ABP Framework 中,若想使用官方完整支援的 MFA 功能,通常需要升級至 Pro 版本。
事實上,ASP.NET Core Identity 本身就內建了基本的 MFA 支援。若不追求 Pro 版那種進階與全面的安全機制,只想啟用一般的多因素驗證功能,其實只需透過少量設定與簡單的 UI 介面,就能達成大部分的實務需求。
本文將引導你一步一步地,從基礎開始,逐步完成在 ABP Framework MVC 專案中啟用 MFA 的完整流程。
完成功能如下
1.使用者登入後,如果沒啟用 MFA ,則會被導到啟用 MFA 畫面


2.使用者啟用 MFA 後,下次登入後,會需要輸入 MFA 驗證碼來登入驗證。

實作
步驟 1:建立 single-layer 的 MVC 專案
1.建立 single-layer, leptonx-lite theme, mssql 的測試專案,在 Command 視窗中執行以下 Command:
abp new Sun -t app-nolayers --theme leptonx-lite -csf
2.cd Sun/Sun
執行 abp install-libs
安裝 ABP 所需要的 Client Library
3.透過 VSCode or VS.NET 開啟 Sun 方案,為了簡單測試,開啟 SunModule.cs
將其中的 IsMultiTenant
設定成 false
(public const bool IsMultiTenant = false;
)
4.建立資料表:
確定 appsettings.json
中的資料庫連線字串是正確的。
在 Command 視窗執行 dotnet run --migrate-database
來建立資料庫及資料表
5.在 appsettings.json
加入啟用 MFA 的設定值 (Abp.Identity.EnableTwoFactorAuthentication
)
1 | { |
- 註: 如果沒安裝 ABP CLI 請先在 Command Window 中執行
dotnet tool install -g Volo.Abp.Studio.Cli
來安裝 - 註: 環境中要有 Node JS
步驟 2:在 個人資料管理頁面(Account/Manage)中 增加 MFA 設定功能
1.新增 QRCoder
Nuget 套件(dotnet add package QRCoder
)(因為要產生 QRCode 讓 Google/Microsoft Authenticator 去掃描)
2.要在Volo.Abp.Account.Web/Pages/Account/Components/ProfileManagementGroup
中新增一個頁面,所以在 Pages 目錄中,新增 Account/Components/ProfileManagementGroup/TwoFactorAuthentication
這 4 個目錄
3.新增 AccountProfileTwoFactorAuthenticationManagementGroupViewComponent.cs
負責建立使用者要註冊的 QRCode,再將它導到Default.cshtml
呈現在使用者登入後,點選頭像,選擇我的帳號,程式如下,
1 | using Microsoft.AspNetCore.Identity; |
被執行時,會透過 CurrentUser 的 Email 來取得使用者,再透過 UserManager 來取得 AuthenticatorKey ,組出 otpauth 的 url 並建立它的 QRCode 圖檔。最後將這些資料傳給Default.cshtml
otpauthUri 是一種標準化的 URI 格式,通常用來在多因素驗證(MFA)流程中產生 QR Code,供使用者透過像是 Google Authenticator、Microsoft Authenticator 等 TOTP(Time-based One-Time Password)App 掃描並註冊帳號。
4.建立使用者要註冊啟用或停用的畫面(Default.cshtml
)
1 | @using Microsoft.AspNetCore.Mvc.Localization |
有 2 個 div,當使用者已啟用 MFA 時,可以停用它。當使用者沒啟用時,可以輸入驗證碼去啟用它。
5.建立Default.js
去控制 div 的顯示與 Button 的處理
1 | (function ($) { |
- 註: sun.services.twoFactorAuth 是 ABP 自動為 AppService 建立的 Client Proxy ,可讓 JS 呼叫 AppService 的 Method
6.建立 TwoFactorAuthAppService
來處理使用者針對 MFA 的相關處理
在 Services
目錄中,新增 TwoFactorAuthAppService.cs
1 | using Microsoft.AspNetCore.Identity; |
7.要將畫面加到個人資料管理頁面(Account/Manage)中,需要將資料加入到 ProfileManagementPageCreationContext
之中 (context.Groups.Add
),所以在專案中新增 Contributors
目錄,新增CustomAccountProfileManagementPageContributor.cs
,程式如下,
1 | using Microsoft.Extensions.Localization; |
8.在SunModule.cs
中加入在個人資料管理頁面增加 MFA 畫面的相關設定,並且把Default.js
加到 Bundles 中,
1 | public override void ConfigureServices(ServiceConfigurationContext context) |
9.增加多國語系設定值
在 Localization/Sun 目錄中,en.json
設定如下,
1 | { |
zh-Hant.json
設定如下,
1 | { |
做到這裡,已成功將畫面加到個人資料管理頁面(Account/Manage)功能之中,請執行dotnet run
來驗證 MFA 畫面是否有正常被加進去
使用 帳號admin
,密碼1q2w3E*
登入後,點選右上方的 admin
,選擇我的帳戶,如下圖,

進到我的帳戶第一個畫面就是雙重驗證設定,如下圖,

用 Google/Microsoft Authenticator 掃描 QRCode 的圖後,輸入驗證碼,就會啟用 MFA 設定,然後畫面就會切換到讓使用者停用 MFA

查看資料庫中AbpUsers
資料表可以發現TwoFactorEnabled
欄位已變成1,AbpUserTokens
資料表,也有對應 User 的資料,如下圖,

當啟用 MFA 後,重新登入後,系統就會發生 NotImplementedException: The method or operation is not implemented. 的錯誤,如下圖,

這是因為預設的登入功能沒有實作TwoFactorLoginResultAsync這個 Method,接下來,我們就來補上這一塊
步驟 3:實作登入後 雙重身份驗證 (MFA) 的驗證
1.實作 Login 的 TwoFactorLoginResultAsync Method
目前使用的是 Abp 9.1 所以 Copy ABP Account Login.cshtml 及 Login.js
來,並繼承Volo.Abp.Account.Web.Pages.Account.LoginModel
來實作 MFA 功能。
在Pages/Account
目錄下,新增Login.cshtml
, Login.cshtml.cs
, Login.js
, LoginWith2fa.cshtml
, Login.cshtml.cs
等 5 個檔案。
Login.cshtml如下,
1 | @page |
Login.cshtml.cs如下,
1 | using Microsoft.AspNetCore.Authentication; |
覆寫 TwoFactorLoginResultAsync Method,將 RememberMe
選項存到 TempData 之中,將它導到LoginWith2fa
進行 MFA 驗證,
Login.js如下,
1 | $(function () { |
2.增加LoginWith2fa
畫面來處理 MFA 驗證碼的驗證,主要會有 驗證碼、RememberMe 及 Remember this device 這 3 個欄位
LoginWith2fa.cshtml,如下
1 | @page |
LoginWith2fa.cshtml.cs,如下
1 | using Microsoft.AspNetCore.Identity; |
完成後,請 執行dotnet run
後,使用 帳號admin
登入後,可以發現會被導到了驗證 MFA 的畫面,如下圖,

到了這裡,我們已經完成了讓使用者可以啟用/停用 MFA,啟用 MFA 的使用者,登入後,會再進行 MFA 的驗證。
當有勾選記住這個裝置,則下次再登入時,如果是同樣的裝置,就不需要再進行 MFA 的驗證。
但是那些沒設定啟用 MFA 的使用者要如何強迫他們啟用 MFA 呢?
接下來, 我們可以使用 Middleware 來處理
步驟 4:建立 Middleware 強制引導使用者完成 MFA
1.新增Middlewares
目錄,新增EnforceMfaMiddleware.cs
的 Middleware,
1 | using Microsoft.AspNetCore.Identity; |
2.在SunModule.cs
中的OnApplicationInitialization
Method 中判斷設定值,如果為true就判斷使用者是否有啟用 MFA ,沒有的話,就強迫轉到 MFA 設定功能。
1 | public override void OnApplicationInitialization(ApplicationInitializationContext context) |
執行dotnet run
後,使用 帳號admin
,密碼1q2w3E*
登入後,可以發現,使用者沒啟用 MFA 就會被道到 啟用畫面。
結論
透過本篇教學,我們完整實現了在 ABP Framework MVC 專案中啟用多因素驗證 (MFA) 的功能,從專案初始化到 MFA 設定畫面、登入驗證以及強制啟用 MFA 的 Middleware,涵蓋了完整的實作流程。這不僅提升了應用程式的安全性,也展示了如何靈活運用 ABP Framework 的擴展能力。
希望這篇文章能幫助你在實務中更好地應用 ABP Framework。如果有任何問題或建議,歡迎在下方留言討論!
完整程式碼