Я недавно обновил свое приложение .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));
});
В методе OnAuthorizationAsync BearerAuthorizeFilter у меня есть следующая логика:
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? Как мне переписать метод OnAuthorizationAsync, чтобы он пропустил / пропустил политику, если присутствует несколько AuthorizationFilters?