为用户添加2fa验证器

DaI*_*mTo 6 c# google-authenticator asp.net-identity asp.net-core identityserver4

我一直在尝试弄清楚如何在我的 Identity server 4 应用程序中使用 Google 身份验证启用 2f 登录。

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

如果我检查

var userFactors = await _userManager.GetValidTwoFactorProvidersAsync(user);
Run Code Online (Sandbox Code Playgroud)

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

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

在此输入图像描述

我已经弄清楚如何创建为验证器应用程序生成二维码所需的秘密。以及如何构建 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");
        }
Run Code Online (Sandbox Code Playgroud)

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

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

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

Fed*_*uma 3

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

var code = _userManager.GenerateNewAuthenticatorKey(); 
Run Code Online (Sandbox Code Playgroud)

您应该知道,使用GenerateNewAuthenticatorCodeAsync不会保留密钥,因此对 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);
}
Run Code Online (Sandbox Code Playgroud)

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

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

  • 如果您使用 Entity Framework Core 作为底层存储(使用实体的默认映射),则它应该持久保存在具有“LoginProvider = [AspNetUserStore]”和“Name = AuthenticatorKey”的“AspNetUserTokens”表中。 (4认同)
  • 您知道这些数据临时存储在数据库中的哪个位置吗?我现在要在用户编辑中进行设置。 (2认同)