如何在 ASP.Net Core 2 中通过电子邮件实现两因素身份验证?

Hus*_*hir 5 authentication two-factor-authentication usermanager asp.net-core-2.2

我使用 ASP.NET Core 2.2 作为 Web 服务器,每次用户登录网站时,在输入正确的电子邮件和密码后,我需要向用户电子邮件发送一条包含4 位 PIN 码的消息,以使用它作为电子邮件双重身份验证,以及此 PIN 码,在发送后 10 分钟过期

我可以手动执行此操作(生成随机 PIN 码,将它们保存在数据库中,使用 if 语句验证它们等...),这会起作用,但我创建了这个问题来询问如何使用可用的 ASP.NET Core 2 执行此操作功能(可以为我节省数据库表)。

我尝试了UserManager.GenerateTwoFactorTokenAsync(TUser, String) Method,生成一个令牌并将其发送到电子邮件:

var token = await _userManager.GenerateTwoFactorTokenAsync(user, "Default");
SendLoginTokenToUserEmail(user, token);
Run Code Online (Sandbox Code Playgroud)

并使用UserManager.VerifyTwoFactorTokenAsync(TUser, String, String)来验证它:

var verified = await _userManager.VerifyTwoFactorTokenAsync(user, "Default", token);
Run Code Online (Sandbox Code Playgroud)

这工作得很好,但我的问题是生成的令牌不是 4 位 PIN 码,其过期时间不是 10 分钟(我认为默认值为 1 天)。

所以,我的问题是:如何在 ASP.NET Core 2.2 中为双因素身份验证自定义 UserManager 生成的令牌?

这可以通过创建自定义令牌提供程序来完成吗?(我在这里使用默认令牌提供程序)如果是这样,这样做的步骤是什么?我花了几个小时浏览 Docs 和 ASP.NET Core 2 文章,但没有找到我需要的。

PS:如果除了 UserManager 之外还有其他方法,我都听过,但我认为这可能是最好的方法,尤其是我们系统中到处都使用 UserManager(用于登录、密码重置等...)。

小智 1

如果您需要 OTP,请使用“电子邮件”或“电话”作为 tokenProvider

var token = await _userManager.GenerateTwoFactorTokenAsync(user, "Email");
SendLoginTokenToUserEmail(user, token);
Run Code Online (Sandbox Code Playgroud)

并使用相同的 tokenProvider 验证令牌

var verified = await _userManager.VerifyTwoFactorTokenAsync(user, "Email", token);
Run Code Online (Sandbox Code Playgroud)

最大尝试次数(默认为 5)

2FA 代码是使用基于时间的一次性密码算法生成的,代码的有效期为六分钟。