c# - 向用户添加 2fa 身份验证器

标签 c# asp.net-core asp.net-identity identityserver4 google-authenticator

我一直在努力研究如何在我的身份服务器 4 应用程序中使用 Google 身份验证启用 2f 登录。

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

如果我检查

var userFactors = await _userManager.GetValidTwoFactorProvidersAsync(user);

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

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

enter image description here

我已经研究出如何创建为 authecator 应用程序创建 QR 码所需的 secret 。以及如何构建二维码和测试代码
 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");
        }

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

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

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

最佳答案

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

var code = _userManager.GenerateNewAuthenticatorKey(); 

您应该知道使用 GenerateNewAuthenticatorCodeAsync不是 保留 key ,因此对 2FA 没有用。

相反,如果尚未创建 key ,则需要在底层存储中生成 key 并将其持久化:
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);
}

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

如果不将 key 保存在存储中,AuthenticatorTokenProvider将永远无法生成 token ,并且在调用 GetValidTwoFactorProvidersAsync 时将不可用.

关于c# - 向用户添加 2fa 身份验证器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51305556/

相关文章:

c# - Linq 中没有 return 关键字的 Func<int,bool>?

c# - 限制/限制 serviceBus 队列以触发 ServiceBusTrigger 形式的消息

asp.net-core - 如何将 css、js 或图像文件缓存到 asp.net 核心

c# - 包括所有匹配 regex razor cshtml 的文件

c# - 从 ASP.NET MVC 5 中的角色中删除用户

c# - 反向查找 asp.net 路由 url

c# - 在托管服务中使用时,asp.net core AppSettings 失败

c# - IIdentity、IPrincipal 或 IUser : what's the difference?

c# - 如何在用户配置文件中创建自定义附加字段

c# - 如何检索给定 HttpRequestMessage 的路由模板变量?