我是 ASP.NET Core 6.0 身份双因素身份验证的新手。最新的身份框架添加了几个 Razor 页面,包括
EnableAuthenticator.cshtml
、TwoFactorAuthentication.cshtml
和LoginWith2fa.cshtml
.
我不确定如何在注册和登录流程中使用它们。我正在按照此链接中描述的方法进行操作。
https://www.meziantou.net/implementing-two-factor-authentication-in-an-asp-net-core-application.htm
根据链接,我已经下载了
qrcode.js
并将其包含在wwwroot/js
文件夹中,并在EnableAuthenticator.cshtml
文件的末尾添加了以下代码。
@section Scripts {
<partial name="_ValidationScriptsPartial" />
<script src="~/lib/qrcode/qrcode.min.js"></script>
<script type="text/javascript">
new QRCode(document.getElementById("qrCode"),
{
text: "@Html.Raw(Model.AuthenticatorUri)",
width: 200,
height: 200
});
</script>
}
每当有人使用电子邮件/密码注册到网站时,在
AspNetUsers
表中,我正在设置TwoFactorEnabled = true
。登录时,我不确定是重定向到 LoginWith2fa
页面还是 EnableAuthenticator
页面。
以下是我在登录页面的代码:
public async Task<IActionResult> OnPostAsync(string returnUrl = null)
{
returnUrl ??= Url.Content("~/");
ExternalLogins = (await _signInManager.GetExternalAuthenticationSchemesAsync()).ToList();
if (ModelState.IsValid)
{
var result = await _signInManager.PasswordSignInAsync(Input.Email, Input.Password, Input.RememberMe, lockoutOnFailure: false);
if (result.Succeeded)
{
_logger.LogInformation("User logged in.");
string url = $"{stringeGrantsURL}{"?UserToken="}{jwtToken}";
return Redirect(url);
}
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();
}
}
return Page();
}
使用当前代码,用户将被发送到
LoginWith2fa
页面,该页面要求输入验证码,但该代码不可用。
相反,如果我将用户定向到
EnableAuthenticator.cshtml
页面,它只会重定向到 Login.cshtml
页面。我尝试用谷歌搜索这个问题,但大多数示例都与使用 MVC 标识的 ASP.NET Core 5.0 有关,而不是使用 Razor 页面的 .NET Core 6.0。
每当有人使用电子邮件/密码注册网站时,在 AspNetUsers 表,我正在设置 TwoFactorEnabled = true
事实上,您不应该简单地将db中的
TwoFactorenabled
列设置为true,您必须先按照本页中的步骤配置身份验证器应用程序:
如果我将用户定向到 EnableAuthenticator.cshtml 页面,它只是 重定向到 Login.cshtml 页面。
你可以查看Identity的source codes
public void PostConfigure(string name, RazorPagesOptions options)
{
name = name ?? throw new ArgumentNullException(nameof(name));
options = options ?? throw new ArgumentNullException(nameof(options));
options.Conventions.AuthorizeAreaFolder(IdentityUIDefaultAreaName, "/Account/Manage");
options.Conventions.AuthorizeAreaPage(IdentityUIDefaultAreaName, "/Account/Logout");
var convention = new IdentityPageModelConvention<TUser>();
options.Conventions.AddAreaFolderApplicationModelConvention(
IdentityUIDefaultAreaName,
"/",
pam => convention.Apply(pam));
options.Conventions.AddAreaFolderApplicationModelConvention(
IdentityUIDefaultAreaName,
"/Account/Manage",
pam => pam.Filters.Add(new ExternalLoginsPageFilter<TUser>()));
}
它添加了 gobal 授权属性到管理文件夹,如果你没有登录(使用 2FA)成功,它会重定向你到登录页面
你应该遵循流程:
1,使用邮箱/密码登录
2,按照指南启用2FA认证
3,当您使用2FA登录时,输入您从Microsoft Authenticator获得的代码