Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net core 如何在ASP.NET核心身份中结合外部登录和双因素身份验证?_Asp.net Core_Asp.net Core Identity_Two Factor Authentication_Asp.net Core 3.1 - Fatal编程技术网

Asp.net core 如何在ASP.NET核心身份中结合外部登录和双因素身份验证?

Asp.net core 如何在ASP.NET核心身份中结合外部登录和双因素身份验证?,asp.net-core,asp.net-core-identity,two-factor-authentication,asp.net-core-3.1,Asp.net Core,Asp.net Core Identity,Two Factor Authentication,Asp.net Core 3.1,我正在为一个使用ASP.NET Core 3.1构建的简单web应用程序实现身份验证和授权。到目前为止,ASP.NET Core Identity满足以下要求:外部登录的默认实现(在本例中为Google)似乎与双因素身份验证的默认实现不兼容 当我使用本地帐户(配置了2FA)登录时,系统会提示我输入TOTP令牌。当我使用Google帐户登录时,没有提示输入第二个因素。我花了几天时间研究这个(例如docs.microsoft.com、Google等等),但没有发现任何有用的东西。如何获取ASP.NE

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

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

先决条件:

  • 使用ASP.NET核心标识的ASP.NET核心项目,其中一个或多个外部登录提供程序已配置并正在运行,例如Google
这是我如何让它工作的

  • 使用以下步骤覆盖帐户/外部登录页面。(我还将该页面添加到了。谢谢,Internet存档!)
  • 打开ExternalLogin.cshtml.cs文件并找到
    OnGetCallbackAsync
    方法
  • 查找对
    \u signInManager.externalLoginIgnnAsync()
    的调用,并将
    bypassTwoFactor
    参数从true更改为false
  • 查找检查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", new { ReturnUrl = returnUrl, RememberMe = false });
        }
        if (result.IsLockedOut)
        {
            return RedirectToPage("./Lockout");
        }
        else
        {
            // existing code omitted for brevity
        }
    
    注意:由于我找不到任何关于如何做到这一点的文档或示例,我承认我的实现可能不是最优的。如果你知道更好的方法,请分享