我最近将.NET Core应用程序从2.0更新到了2.1。
我有一个在启动过程中添加的授权过滤器:
var posBearerPolicy = new AuthorizationPolicyBuilder()
.AddAuthenticationSchemes(JwtBearerDefaults.AuthenticationScheme)
.RequireAuthenticatedUser()
.AddRequirements(new POSBearerRequirement())
.Build();
services.AddMvc(options =>
{
options.Filters.Add(new BearerAuthorizeFilter(posBearerPolicy));
});
在BearerAuthorizeFilter的OnAuthorizationAsync方法中,我具有以下逻辑:
public override Task OnAuthorizationAsync(AuthorizationFilterContext context)
{
if (context.Filters.Count(f => f is AuthorizeFilter) > 1 || context.Filters.Any(f => f is AllowAnonymousFilter))
{
return Task.CompletedTask;
}
return base.OnAuthorizationAsync(context);
}
这完全符合我在.NET Core 2.0中的要求。我有适用于所有控制器的默认授权策略。如果要覆盖该策略,则只需向控制器添加[Authorize(NAME)]属性。在该OnAuthorizationAsync中,它将检测到控制器上的多个AuthorizeFilter属性,然后仅应用我为该特定控制器覆盖的策略。
但是,自从更新到.NET Core 2.1之后,我上面的posBearerPolicy总是被应用。我有一个具有自定义属性的API控制器,该自定义属性继承自AuthorizeAttribute,该属性定义了自己的策略,并且在启动期间进行了所有设置。
即使在那个时候
return Task.CompletedTask;
一行被击中,该框架仍在应用我的posBearerPolicy。
有人知道我想念什么吗?是什么引起了.NET Core 2.1中的更改?如果存在多个AuthorizationFilter,我应该如何重写OnAuthorizationAsync方法以告诉它跳过/跳过策略?