c# - 向用户添加 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 列。但没有关于身份验证器的信息。
我目前正在研究创建一个自定义用户管理器并将一个字段添加到应用程序用户中。我真的希望有人有更好的主意。
解决方案
据我所知,每次用户需要配置身份验证器应用程序时,您都会生成一个新的身份验证器密钥:
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
。
推荐阅读
- time-series - Should I do statistical test in other time-series features to check stationary?
- performance - Parallel benchmarks on coda and map reduce function
- python - Django:特定的 unique_together 条件
- ios - 无法使用 cargo lipo --release 构建库
- javascript - Capybara 不选择没有 JavaScript 的单选按钮
- python - pypdf2命令将pdf转换为html失败并出现TypeError:write()参数必须是str,而不是字节,pdfminer,
- c# - 套接字已在使用广播
- python - 使用静态链接 C++ 扩展的 Python 包
- r - 如何从 R 中的网站上抓取表格
- python - 如何从 numpy 数组中删除在另一个数组中等于零的所有元素?