绕过.NET Core 2.1中的默认AuthorizeFilter

Cou*_*ier 6 .net c# asp.net-core asp.net-core-2.0 asp.net-core-2.1

我最近将我的.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));
});
Run Code Online (Sandbox Code Playgroud)

在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);
}
Run Code Online (Sandbox Code Playgroud)

这完全符合我在.NET Core 2.0中的要求.我有一个适用于我所有控制器的默认授权策略.如果我想覆盖该策略,那么我只需在控制器中添加[Authorize(NAME)]属性.在OnAuthorizationAsync中,它将检测控制器上的多个AuthorizeFilter属性,然后仅应用我为该特定控制器重写的策略.

但是,自从更新到.NET Core 2.1以来,上面的posBearerPolicy正在应用.我有一个API控制器,其自定义属性继承自AuthorizeAttribute,该属性具有自己的策略定义和启动期间设置的所有内容.

即使那样

return Task.CompletedTask;
Run Code Online (Sandbox Code Playgroud)

线被击中,框架仍在应用我的posBearerPolicy.

有谁知道我错过了什么?导致这种情况在.NET Core 2.1中发生了什么变化?如果存在多个AuthorizationFilters,我应该如何重新编写OnAuthorizationAsync方法以告诉它跳过/绕过策略?