如何在asp net core 6.0中用identity实现双因素认证

问题描述 投票:0回答:1

我是 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。

asp.net-core asp.net-core-identity
1个回答
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获得的代码

© www.soinside.com 2019 - 2024. All rights reserved.