Cookie身份验证不适用于asp.net核心中的授权策略

将Scott Wildermuth的World Trip应用升级到ASP.NET Core 2.0。 下面的代码不起作用。

由于我使用两种身份验证类型,我希望两者都能在api控制器上工作,所以我决定使用授权策略。

public void ConfigureServices(IServiceCollection services)
{
   //Some codes here
   services.AddAuthentication()
       .AddCookie()
       .AddJwtBearer(**Implementation is fine**);

   services.AddAuthorization(options =>
   {
       options.AddPolicy("Authenticated", policy =>
       {
           policy.AddAuthenticationSchemes(
               CookieAuthenticationDefaults.AuthenticationScheme,
               JwtBearerDefaults.AuthenticationScheme)
                   .RequireAuthenticatedUser();
       });
   });
}

现在在我的控制器中,

namespace TheWorld.Controllers.Api
{
    [Route("api/trips")]
    [Authorize(policy: "Authenticated")]
    public class TripsController : controller
    {
      // Implementation is fine
    }
}

来自客户端(web)的使用cookie身份验证的请求永远不会被视为已通过身份验证,而来自Jwt身份验证客户端的请求按预期工作。

如果我在控制器上使用简单的[Authorize] ,它只适用于cookie身份验证,其中asp.net核心只选择默认的cookie身份验证,并且从不接受来自Jwt客户端的请求。


policy.AddAuthenticationSchemes(scheme1, scheme2)

这意味着为了使策略认证成功, 两个指定的认证方案都必须成功。

您的两个身份验证方案可能已设置,以便当JWT身份验证成功时,它将自动成功进行cookie身份验证(在该情况下设置Cookie,因此,在进一步请求JWT令牌不再需要但Cookie足够时)。 所以当JWT认证成功时,cookie认证也是成功的。 但是,情况却并非如此:如果您仅使用cookie来建立身份验证,那么JWT令牌可能根本就不存在。

如果您不关心提供身份验证的身份验证方案,则应该删除AddAuthenticationSchemes调用。 通过说policy.RequireAuthenticatedUser()你基本上是说需要有一些验证方案成功验证用户。

这是btw。 完全相同的行为,默认策略(只有[Authorize] )具有。

链接地址: http://www.djcxy.com/p/22435.html

上一篇: Cookie Authentication not working with Authorization policy in asp.net core

下一篇: Could we destroy JWT token in Asp.NET Core?