绕过.NET Core 2.1中的默认AuthorizeFilter

时间:2018-06-26 22:56:47

标签: c# .net 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));
});

在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方法以告诉它跳过/跳过策略?

0 个答案:

没有答案