如何在ASP.NET Core Identity中结合使用外部登录和两因素身份验证?

我正在为使用ASP.NET Core 3.1构建的简单Web应用程序实现身份验证和授权。到目前为止,ASP.NET Core Identity满足以下要求之一:外部登录的默认实现(在这种情况下为Google)似乎与双向身份验证的默认实现不兼容。

当我使用本地帐户(配置2FA)登录时,系统会提示我输入TOTP令牌。当我使用Google帐户登录时,没有提示输入第二个因素。我花了几天时间对此进行了研究(例如docs.microsoft.com,Google等),但没有发现任何有用的信息。如何为使用Google登录的用户获取ASP.NET Core身份验证以使用两因素身份验证?

a476188049 回答:如何在ASP.NET Core Identity中结合使用外部登录和两因素身份验证?

先决条件:

  • 一个使用ASP.NET Core Identity的ASP.NET Core项目,其中一个或多个外部登录提供程序已经配置并且可以正常工作,例如Google。

这就是我的工作方式。

  1. 使用Scaffold Identity过程覆盖“帐户/外部登录”页面。 (我也将该页面添加到了Wayback Machine。谢谢,Internet存档!)
  2. 打开ExternalLogin.cshtml.cs文件并找到OnGetCallbackAsync方法。
  3. 找到对_signInManager.ExternalLoginSignInAsync()的调用,并将bypassTwoFactor参数从true更改为false。
  4. 找到条件语句,这些条件语句检查ExternalLoginSignInAsync()的结果,并添加以下代码:

        if (result.RequiresTwoFactor)
        {
            return RedirectToPage("./LoginWith2fa",new { ReturnUrl = returnUrl,RememberMe = false });
        }
    

将它们放在一起,您应该具有以下内容:

    // Sign in the user with this external login provider if the user already has a login.
    var result = await _signInManager.ExternalLoginSignInAsync(info.LoginProvider,info.ProviderKey,isPersistent: false,bypassTwoFactor : false);
    if (result.Succeeded)
    {
        _logger.LogInformation("{Name} logged in with {LoginProvider} provider.",info.Principal.Identity.Name,info.LoginProvider);
        return LocalRedirect(returnUrl);
    }
    if (result.RequiresTwoFactor)
    {
        return RedirectToPage("./LoginWith2fa",RememberMe = false });
    }
    if (result.IsLockedOut)
    {
        return RedirectToPage("./Lockout");
    }
    else
    {
        // existing code omitted for brevity
    }

注意:由于我找不到有关此操作的任何文档或示例,因此我接受我的实现可能不是最佳方法。如果您知道更好的方法,请分享!

本文链接:https://www.f2er.com/2956494.html

大家都在问