Cookie身份验证无法与asp.net核心中的授权策略一起使用

时间:2017-09-12 12:22:07

标签: c# asp.net-mvc authentication cookies asp.net-core

将Scott Wildermuth的World Trip应用程序升级到ASP.NET Core 2.0。以下代码无效。

由于我使用两种身份验证类型,并且我希望两者都能使用api控制器,因此我决定使用授权策略。

public void ConfigureServices(IServiceCollection services)
{
   //Some code 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客户端的请求。

1 个答案:

答案 0 :(得分:1)

policy.AddAuthenticationSchemes(scheme1, scheme2)

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

您可能设置了两种身份验证方案,以便在JWT身份验证成功时,它会自动成功进行cookie身份验证(在这种情况下设置cookie,因此在进一步请求时不再需要JWT令牌,但cookie是足够)。因此,当JWT身份验证成功时,cookie身份验证也会成功。但是,情况恰恰相反:如果您只使用cookie来建立身份验证,那么JWT令牌可能根本就不存在。

如果您不关心哪个身份验证方案提供了身份验证,则应该删除AddAuthenticationSchemes来电。通过说policy.RequireAuthenticatedUser(),您基本上说需要某些身份验证方案才能成功验证用户。

这是顺便说一句。完全相同的行为,默认策略(只有[Authorize])有。