首页 > 解决方案 > 向用户添加 2fa 身份验证器

问题描述

我一直在尝试解决如何在我的身份服务器 4 应用程序中使用 Google 身份验证启用 2f 登录。

2fa 适用于电子邮件和电话。

如果我检查

var userFactors = await _userManager.GetValidTwoFactorProvidersAsync(user);

它有两个email and phone。我假设这将是为该用户设置的两个因素提供者。

现在,如果我_usermanager再次检查,则有一个名为tokenproviders. 其中似乎包含default, email, phone, and authenticator. 我假设这些是 Asp .net 身份配置处理的那些。

在此处输入图像描述

我已经研究出如何创建为 authecator 应用程序生成 QR 码所需的秘密。以及如何构建二维码和测试代码

 var code = _userManager.GenerateNewAuthenticatorKey();      

 var qr = AuthencatorHelper.GetQrCodeGoogleUrl("bob", code, "My Company");

 var user = await _signInManager.TwoFactorAuthenticatorSignInAsync(codeFromAppToTestWith, true, false);
        if (user == null)
        {
            return View("Error");
        }

现在的问题。我已经了解了我可以在用户身上找到的所有方法,试图弄清楚如何向用户添加另一个令牌提供程序。

如何为用户分配新的令牌提供程序并提供创建身份验证代码所需的密码?我什至没有在数据库设置中看到任何表来处理这些信息。电子邮件和电话号码在那里,并且有一个 2faenabled 列。但没有关于身份验证器的信息。

我目前正在研究创建一个自定义用户管理器并将一个字段添加到应用程序用户中。我真的希望有人有更好的主意。

标签: c#asp.net-coreasp.net-identityidentityserver4google-authenticator

解决方案


据我所知,每次用户需要配置身份验证器应用程序时,您都会生成一个新的身份验证器密钥:

var code = _userManager.GenerateNewAuthenticatorKey(); 

您应该知道 usingGenerateNewAuthenticatorCodeAsync不会持久化密钥,因此对 2FA 没有用处

相反,如果尚未创建密钥,则需要在底层存储中生成和持久化密钥:

var key = await _userManager.GetAuthenticatorKeyAsync(user); // get the key
if (string.IsNullOrEmpty(key))
{ 
    // if no key exists, generate one and persist it
    await _userManager.ResetAuthenticatorKeyAsync(user);
    // get the key we just created
    key = await _userManager.GetAuthenticatorKeyAsync(user);
}

如果尚未完成,它将生成密钥并将其保存在数据库(或为身份配置的任何存储)中。

如果不将密钥持久化到存储中,AuthenticatorTokenProvider将永远无法生成令牌,并且在调用 时将不可用GetValidTwoFactorProvidersAsync


推荐阅读