Authorization Policy requireAuthenticatedUser 是否兼容多种认证形式(cookie 和 JWT)

Is Authorization Policy requireAuthenticatedUser compatible with multiple forms of authentication (cookie and JWT)

我有一个 ASP.NET Core 2.2 MVC 应用程序和一个 Web API。我对 MVC 页面使用 cookie 身份验证,对 API 使用 JWT Bearer 身份验证。我遵循 which is based on https://wildermuth.com/2017/08/19/Two-AuthorizationSchemes-in-ASP-NET-Core-2

中描述的解决方案

当我想添加授权策略以确保整个站点对经过身份验证的用户可用时,麻烦就来了

services.AddMvc(config =>
            {
                var policy = new AuthorizationPolicyBuilder()
                                 .RequireAuthenticatedUser()
                                 .Build();
                config.Filters.Add(new AuthorizeFilter(policy));
            }) 

当我这样做时,即使属性 [Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)] 存在,JWT Bearer 身份验证也会被忽略。因此访问这些 API 控制器 returns 重定向到登录页面。

我如何启用授权策略并仍然保持两种形式的身份验证?解决方法是将 [Authorize] 属性添加到所有控制器

您可以在构建时结合 jwt 承载模式和 asp.net 身份验证模式 AuthorizationPolicy :

var policy = new  AuthorizationPolicyBuilder(new[] { JwtBearerDefaults.AuthenticationScheme, IdentityConstants.ApplicationScheme })
.RequireAuthenticatedUser()
.Build();
config.Filters.Add(new AuthorizeFilter(policy));

以便通过 asp.net 身份验证和 JWT 令牌身份验证都可以访问您的受保护操作。

这似乎是 .Net 核心中的一个已知问题。我用的是.NET Core 3.1,还是没有解决。

这是我的解决方法:

 var principal = context.User;
        if (!principal.Identity.IsAuthenticated)
        {
            return Task.FromResult(0);  //user not logged in
        }