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]
)具有。
上一篇: Cookie Authentication not working with Authorization policy in asp.net core