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

时间:2018-07-12 12:20:34

标签: 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

我已经研究出如何创建为验证者应用生成QR码所需的机密。以及如何构建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列。但是关于身份验证器什么也没有。

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

1 个答案:

答案 0 :(得分:0)

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

var code = _userManager.GenerateNewAuthenticatorKey(); 

您应该注意,使用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);
}

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

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

相关问题