Обойти авторизацию и разрешить администраторам доступ ко всему в .NET Core 2? - PullRequest
0 голосов
/ 19 июня 2019

Я хочу разрешить пользователю с ролью «Администратор» неявно обращаться к каждому ресурсу.

Рассмотрим этот пример:

[Authorize(Role = "BusinessOwner")]
public class UpdateModel : PageModel
{
    public ActionResult OnPost()
    {
    }
}

Роль "Администратор" должна быть установлена ​​явно. Добавление всех ролей пользователю-администратору не вариант, поскольку роли могут (читай, будут) меняться со временем.

[Authorize(Role = "Admin, BusinessOwner")]
public class UpdateModel : PageModel
{
    public ActionResult OnPost()
    {
    }
}

Больше не рекомендуется создавать пользовательский AuthorizeAttribute, так как лучше всего обходить проверку авторизации и разрешать доступ администратора в .NET Core 2?

Ответы [ 2 ]

1 голос
/ 19 июня 2019

Я получил большое вдохновение от этого ответа: 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

1 голос
/ 19 июня 2019

Попробуйте авторизацию на основе политик.Вы можете найти пример из https://docs.microsoft.com/en-us/aspnet/core/security/authorization/policies?view=aspnetcore-2.2 Он достаточно гибкий с любой ролью и другой комбинацией свойств, которую вы хотите.

После создания политики вы можете применить ее в качестве глобального фильтра.

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc(o =>
    {
        var policy = new AuthorizationPolicyBuilder()
            .RequireRole("Admin")
            .Build();
        o.Filters.Add(new AuthorizeFilter(policy));
    });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...