Авторизация на основе политик против авторизации с ролью в .Net Core - PullRequest
0 голосов
/ 19 октября 2019

В чем разница между использованием авторизации на основе политик и авторизацией с ролью, или нет никакой разницы?

[Authorize (Policy = "RequiredAdminRole")]

и

[Authorize (Roles = "Admin")]

Ответы [ 2 ]

1 голос
/ 21 октября 2019

Для Ролевая авторизация , Роли предоставляются разработчику с помощью метода IsInRole в классе ClaimsPrincipal.

По моему мнению, нет никакой разницы, если вы имеете в виду, что Политиканастроен как

services.AddAuthorization(options =>
          options.AddPolicy("RequiredAdminRole",
          policy => policy.RequireRole("Admin"));
        }

с RequireRole :

public AuthorizationPolicyBuilder RequireRole(IEnumerable<string> roles)
    {
        if (roles == null)
        {
            throw new ArgumentNullException(nameof(roles));
        }

        Requirements.Add(new RolesAuthorizationRequirement(roles));
        return this;
    }

и RolesAuthorizationRequirement

public IEnumerable<string> AllowedRoles { get; }

    /// <summary>
    /// Makes a decision if authorization is allowed based on a specific requirement.
    /// </summary>
    /// <param name="context">The authorization context.</param>
    /// <param name="requirement">The requirement to evaluate.</param>

    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, RolesAuthorizationRequirement requirement)
    {
        if (context.User != null)
        {
            bool found = false;
            if (requirement.AllowedRoles == null || !requirement.AllowedRoles.Any())
            {
                // Review: What do we want to do here?  No roles requested is auto success?
            }
            else
            {
                found = requirement.AllowedRoles.Any(r => context.User.IsInRole(r));
            }
            if (found)
            {
                context.Succeed(requirement);
            }
        }
        return Task.CompletedTask;
    }

Вы можете видеть, чтополитика просто проверить результат context.User.IsInRole("Admin").

0 голосов
/ 19 октября 2019

Авторизация на основе политик дает вам больше гибкости. Вы можете использовать настраиваемые обработчики авторизации с политиками, чтобы добавить более сложную логику, чем просто проверка наличия у вашего пользователя определенной роли. Например, у вас есть несколько отображений ролей в вашей базе данных. Вы можете создать политику, которая будет проверять, авторизован ли ваш пользователь в соответствии с этими данными, или это может быть любая пользовательская логика. Вы также можете создать политику только с .RequireRole("Admin"), которая технически будет делать то же самое, что и атрибут [Authorize(Roles = "Admin")] Посмотрите, как реализовать пользовательские обработчики авторизации в документации

...