基于策略的授权与在 .Net Core 中使用角色授权

Has*_*esh 6 .net asp.net-roles asp.net-core

使用基于策略的授权和使用角色授权有什么区别,或者没有区别?

[Authorize(Policy = "RequiredAdminRole")]
Run Code Online (Sandbox Code Playgroud)

[Authorize(Roles = "Admin")]
Run Code Online (Sandbox Code Playgroud)

Rya*_*yan 6

对于基于角色的授权,角色通过 ClaimsPrincipal 类上的 IsInRole 方法公开给开发人员。

在我看来,如果您的意思是将策略配置为

services.AddAuthorization(options =>
          options.AddPolicy("RequiredAdminRole",
          policy => policy.RequireRole("Admin"));
        }
Run Code Online (Sandbox Code Playgroud)

RequireRole

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

        Requirements.Add(new RolesAuthorizationRequirement(roles));
        return this;
    }
Run Code Online (Sandbox Code Playgroud)

角色授权要求

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;
    }
Run Code Online (Sandbox Code Playgroud)

您可以看到该策略只是检查context.User.IsInRole("Admin").


Rom*_*kha 5

基于策略的授权为您提供了更大的灵活性。您可以使用带有策略的自定义授权处理程序来添加更复杂的逻辑,而不仅仅是检查您的用户是否具有特定角色。例如,您的数据库中有一些角色映射。您可以创建一个策略来检查您的用户是否根据该数据获得授权,或者可以是任何自定义逻辑。您还可以仅创建在.RequireRole("Admin")技术上与属性相同[Authorize(Roles = "Admin")] 的策略 看看如何在文档中实现自定义授权处理程序