在我的dotnet core 2.2应用程序中,我正在尝试启用双因素身份验证。在启动类中,我创建了一个种子数据函数,该函数将生成一个示例用户。我使用用户管理器创建用户,然后设置两个因素所需的标志。但是,当用户登录时,它总是成功,并且永远不会到达 RequireTwoFactor 标志 if 语句。
我很确定我在创业课上错过了一些东西。
感谢所有帮助。
启动类 配置方法
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();
}
}
我们遇到了同样的问题。 在更改 netcore 的版本之前,我的团队注意到用户的电子邮件尚未经过验证。 他们验证了电子邮件,问题解决了。
我在实现自定义 MFA 提供程序时刚刚遇到了同样的问题 .net core 3.1.416。 我并不热衷于"电子邮件确认=真实"解决方案,因此对其进行了更多研究。
我发现将 TwoFactorEnabled 设置为 true 是不够的,您还必须在 ASPNetUserTokens 表中创建一个条目。
这可以通过以下方法实现
await _userManager.ResetAuthenticatorKeyAsync(user);
await _userManager.GetAuthenticatorKeyAsync(user);
await _userManager.SetTwoFactorEnabledAsync(user, true);
我遇到了同样的问题。
今天我更新到 .net 核心3.0.100-rc1-014190
问题解决了。因此,如果在ASPNetUsers 表中设置了"TwoFactorEnabled"标志,PasswordSignInAsync 将返回带有 RequiresTwoFactor 的结果