Я получил большое вдохновение от этого ответа: https://stackoverflow.com/a/38773345/3878764.
Если у администратора есть доступ ко всему, вам не нужно явно проверять эту логику авторизации при КАЖДОМ действии.Вам нужно будет проверить его только на действиях, которые уже ограничены - и роль администратора обойдет это ограничение.
Так, например, если вы использовали авторизацию на основе политик, вы могли бы написать Base AuthorizationHandler, который бы закоротил логику, если была найдена роль администратора.
public abstract class RequirementHandlerBase<T> : AuthorizationHandler<T> where T : IAuthorizationRequirement
{
protected sealed override Task HandleRequirementAsync(AuthorizationHandlerContext context, T requirement)
{
//if admin then short-circuit with success
if (context.User.IsInRole("Admin"))
{
context.Succeed(requirement);
return Task.FromResult(true);
}
return HandleAsync(context, requirement);
}
protected abstract Task HandleAsync(AuthorizationHandlerContext context, T requirement);
}
У ВСЕХ вашихОбработчики основаны на базе:
public class AgeRequirementHandler : RequirementHandlerBase<AgeRequirement>
{
protected override HandleAsync(AuthorizationHandlerContext context, AgeRequirement requirement)
{
...
}
}
public class AgeRequirement : IRequrement
{
public int MinimumAge { get; set; }
}
И просто регистрируются как обычно:
services.AddAuthorization(options =>
{
options.AddPolicy("Over18",
policy => policy.Requirements.Add(new AgeRequirement { MinimumAge = 18 }));
});
Кроме того, эта документация по проверкам ролей на основе политик может быть полезна: https://docs.microsoft.com/en-us/aspnet/core/security/authorization/roles?view=aspnetcore-2.2#policy-based-role-checks