SignInResult.RequiresTwoFactor 总是 return 错误

SignInResult.RequiresTwoFactor always return false

在我的 dotnet core 2.2 应用程序中,我试图启用双重身份验证。在启动 class 中,我创建了一个种子数据函数,它将生成一个示例用户。我使用 UserManager 创建用户,然后设置需要两个因素的标志。但是当用户登录时它总是成功并且永远不会达到 RequireTwoFactor 标志 if 语句。

我很确定我在启动时遗漏了一些东西 class。

感谢所有帮助。

启动class配置方法

services.AddIdentity<IdentityUser, IdentityRole>(options =>
{
    options.Tokens.AuthenticatorTokenProvider = "email";
});

种子数据方法

var User = new IdentityUser() { UserName = email, Email = email };
await UserManager.CreateAsync(User, password);
await UserManager.SetTwoFactorEnabledAsync(User, true);

登录页面

if (ModelState.IsValid)
{
    var result = await _signInManager.PasswordSignInAsync(Input.Email, Input.Password, Input.RememberMe, lockoutOnFailure: true);
    if (result.Succeeded)
    {
        _logger.LogInformation("User logged in.");
        return LocalRedirect(returnUrl);
    }
    if (result.RequiresTwoFactor)
    {
        return RedirectToPage("./LoginWith2fa", new { ReturnUrl = returnUrl, RememberMe = Input.RememberMe });
    }
    if (result.IsLockedOut)
    {
        _logger.LogWarning("User account locked out.");
        return RedirectToPage("./Lockout");
    }
    else
    {
        ModelState.AddModelError(string.Empty, "Invalid login attempt.");
        return Page();
    }
}

我遇到过同样的问题

今天更新到.net core 3.0.100-rc1-014190,问题解决了。因此,如果在 ASPNetUsers table 中设置了 'TwoFactorEnabled' 标志,PasswordSignInAsync 将 return 带有 RequiresTwoFactor

的结果

我们遇到了同样的问题。 在更改 netcore 的版本之前,我的团队注意到用户的电子邮件尚未经过验证。 他们验证了电子邮件并解决了问题。

我刚刚在使用 .net core 3.1.416 时遇到了同样的问题,同时实施了自定义 MFA 提供程序。我不喜欢“EmailConfirmed = true”解决方案,所以进一步研究了它。

我发现将 TwoFactorEnabled 设置为 true 是不够的,您还必须在 ASPNetUserTokens table.

中创建一个条目

这可以通过以下方式实现

await _userManager.ResetAuthenticatorKeyAsync(user);
await _userManager.GetAuthenticatorKeyAsync(user);
await _userManager.SetTwoFactorEnabledAsync(user, true);