Warning
使用以時間為基礎的一次性密碼演算法 (TOTP) 的雙因素驗證 (2FA) 驗證器應用程式是 2FA 的業界建議方法。 使用 TOTP 的 2FA 偏好使用 SMS 2FA。 如需詳細資訊,請參閱 在 ASP.NET Core for ASP.NET Core 2.0 或更新版本中啟用 TOTP 驗證器應用程式的 QR 代碼產生 。
本教學課程示範如何使用SMS設定雙因素驗證 (2FA)。 這裡給出twilio和ASPSMS的指示,https://www.aspsms.com/asp.net/identity/core/testcredits/但您可以使用其他的SMS提供者。 建議您先完成 帳戶確認和密碼復原 ,再開始本教學課程。
建立新的 ASP.NET Core 專案
使用個別帳戶建立名為 Web2FA 的新 ASP.NET Core Web 應用程式。 請遵循在 ASP.NET Core 中強制執行 HTTPS 中的 指示來設定並要求 HTTPS。
建立SMS帳戶
例如,從 twilio 或 ASPSMS 建立 SMS 帳戶。https://www.aspsms.com/asp.net/identity/core/testcredits/ 記錄驗證認證(適用於 twilio:accountSid 和 authToken,適用於 ASPSMS:Userkey 和 Password)。
找出SMS提供者認證
Twilio:
從 Twilio 帳戶的 [儀錶板] 索引標籤,複製 [帳戶 SID ] 和 [驗證令牌]。
ASPSMS:
從您的帳戶設定中,流覽至 Userkey ,並將它與您的 密碼一起複製。
我們稍後會使用金鑰 SMSAccountIdentification 和 SMSAccountPassword中的秘密管理員工具,將這些值儲存在 中。
指定 SenderID / Originator
Twilio: 從 [號碼] 索引標籤,複製您的 Twilio 電話號碼。
ASPSMS: 在 [解除鎖定發送者] 功能表中,解除鎖定一或多個發送者,或選擇英數發送者(並非所有網路都支援)。
我們稍後會將此值與秘密管理員工具儲存在密鑰 SMSAccountFrom內。
提供SMS服務的認證
我們將使用 [選項] 模式 來存取使用者帳戶和密鑰設定。
- 建立類別以擷取安全的SMS金鑰。 在此範例中,會在
SMSoptions檔案中Services/SMSoptions.cs建立 類別。
namespace Web2FA.Services
{
public class SMSoptions
{
public string SMSAccountIdentification { get; set; }
public string SMSAccountPassword { get; set; }
public string SMSAccountFrom { get; set; }
}
}
使用SMSAccountIdentification設定 SMSAccountPassword和 SMSAccountFrom 。 例如:
C:/Web2FA/src/WebApp1>dotnet user-secrets set SMSAccountIdentification 12345
info: Successfully saved SMSAccountIdentification = 12345 to the secret store.
- 新增 SMS 提供者的 NuGet 套件。 從套件管理員主控台 (PMC) 執行:
Twilio:
Install-Package Twilio
ASPSMS:
Install-Package ASPSMS
- 在檔案中
Services/MessageServices.cs新增程式代碼以啟用SMS。 使用 Twilio 或 ASPSMS 區段:
Twilio:
using Microsoft.Extensions.Options;
using System.Threading.Tasks;
using Twilio;
using Twilio.Rest.Api.V2010.Account;
using Twilio.Types;
namespace Web2FA.Services
{
// This class is used by the application to send Email and SMS
// when you turn on two-factor authentication in ASP.NET Identity.
// For more details see this link https://go.microsoft.com/fwlink/?LinkID=532713
public class AuthMessageSender : IEmailSender, ISmsSender
{
public AuthMessageSender(IOptions<SMSoptions> optionsAccessor)
{
Options = optionsAccessor.Value;
}
public SMSoptions Options { get; } // set only via Secret Manager
public Task SendEmailAsync(string email, string subject, string message)
{
// Plug in your email service here to send an email.
return Task.FromResult(0);
}
public Task SendSmsAsync(string number, string message)
{
// Plug in your SMS service here to send a text message.
// Your Account SID from twilio.com/console
var accountSid = Options.SMSAccountIdentification;
// Your Auth Token from twilio.com/console
var authToken = Options.SMSAccountPassword;
TwilioClient.Init(accountSid, authToken);
return MessageResource.CreateAsync(
to: new PhoneNumber(number),
from: new PhoneNumber(Options.SMSAccountFrom),
body: message);
}
}
}
ASPSMS:
using Microsoft.Extensions.Options;
using System.Threading.Tasks;
namespace Web2FA.Services
{
// This class is used by the application to send Email and SMS
// when you turn on two-factor authentication in ASP.NET Identity.
// For more details see this link https://go.microsoft.com/fwlink/?LinkID=532713
public class AuthMessageSender : IEmailSender, ISmsSender
{
public AuthMessageSender(IOptions<SMSoptions> optionsAccessor)
{
Options = optionsAccessor.Value;
}
public SMSoptions Options { get; } // set only via Secret Manager
public Task SendEmailAsync(string email, string subject, string message)
{
// Plug in your email service here to send an email.
return Task.FromResult(0);
}
public Task SendSmsAsync(string number, string message)
{
ASPSMS.SMS SMSSender = new ASPSMS.SMS();
SMSSender.Userkey = Options.SMSAccountIdentification;
SMSSender.Password = Options.SMSAccountPassword;
SMSSender.Originator = Options.SMSAccountFrom;
SMSSender.AddRecipient(number);
SMSSender.MessageData = message;
SMSSender.SendTextSMS();
return Task.FromResult(0);
}
}
}
設定啟動以使用 SMSoptions
請在SMSoptions中的ConfigureServices方法中,將Startup.cs新增至服務容器。
// Add application services.
services.AddTransient<IEmailSender, AuthMessageSender>();
services.AddTransient<ISmsSender, AuthMessageSender>();
services.Configure<SMSoptions>(Configuration);
}
啟用雙因素驗證
開啟 Views/Manage/Index.cshtmlRazor 檢視檔案,並移除批註字元(這樣標記就不會被批註掉)。
使用雙因素驗證登入
- 執行應用程式並註冊新的使用者
- 點選您的使用者名稱,以在 [管理控制器] 中啟動
Index動作方法。 然後點選電話號碼 [新增 ] 連結。
- 新增將接收驗證碼的電話號碼,然後點選 [傳送驗證碼]。
- 您將會收到包含驗證碼的簡訊。 輸入並點選 [提交]
如果您沒有收到簡訊,請參閱 twilio 記錄頁面。
- [管理] 檢視會顯示已成功新增您的電話號碼。
- 點選 [啟用 ] 以啟用雙因素驗證。
測試雙因素驗證
登出。
登入。
用戶帳戶已啟用雙因素驗證,因此您必須提供第二個驗證要素。 在本教學課程中,您已啟用電話驗證。 內建範本也可讓您將電子郵件設定為第二個因素。 您可以設定額外的第二個因素進行驗證,例如 QR 代碼。 點選 提交。
輸入您在 SMS 訊息中取得的程式代碼。
單擊「記住此瀏覽器」複選框,將使您在使用相同設備和瀏覽器時免於使用 2FA 登入。 啟用 2FA 並按兩下 [ 記住此瀏覽器 ] 可為您提供強式 2FA 保護,防止嘗試存取您的帳戶的惡意使用者,只要他們無法存取您的裝置。 您可以在您經常使用的任何私人裝置上執行此動作。 藉由設定 記住此瀏覽器,您可以從不常使用的裝置中獲得額外的 2FA 安全性,並且在自己的裝置上不需要進行 2FA,從而享受便利。
帳戶鎖定以防止暴力密碼破解攻擊
建議使用 2FA 鎖定帳戶。 一旦使用者透過本機帳戶或社交帳戶登入,系統會儲存每次 2FA 的失敗嘗試。 如果達到最大失敗的存取嘗試次數,使用者就會遭到鎖定(預設:5 分鐘鎖定后 5 次失敗的存取嘗試)。 成功的驗證會重設失敗的存取嘗試計數,並重設時鐘。 您可以使用MaxFailedAccessAttempts和DefaultLockoutTimeSpan來設定失敗的存取嘗試次數上限和鎖定時間。 下列設定將在 10 次失敗的存取嘗試後鎖定帳戶 10 分鐘:
public void ConfigureServices(IServiceCollection services)
{
// Add framework services.
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
services.AddIdentity<ApplicationUser, IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
services.AddMvc();
services.Configure<IdentityOptions>(options =>
{
options.Lockout.MaxFailedAccessAttempts = 10;
options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(10);
});
// Add application services.
services.AddTransient<IEmailSender, AuthMessageSender>();
services.AddTransient<ISmsSender, AuthMessageSender>();
services.Configure<SMSoptions>(Configuration);
}
請確認PasswordSignInAsync將lockoutOnFailure設為true:
var result = await _signInManager.PasswordSignInAsync(
Input.Email, Input.Password, Input.RememberMe, lockoutOnFailure: true);