首页 > 解决方案 > 多角色授权处理程序 - 仅获取方法角色

问题描述

我正在开发一个 .NET Core Web 应用程序,但我无法使用自定义授权属性处理程序。

我的目标是让自定义授权处理程序使用设置文件(业务需求)。
那么,问题是什么?我将提供尽可能少的代码来解释。

让我们从控制器开始

[Authorize(Roles = Roles.Full)]
[Authorize(Roles = Roles.Read)]
public class ConfigurationController : BaseController
{
    ...
    
    [Authorize(Roles = Roles.Full)]
    public async Task<ActionResult> Edit(ServiceConfigurationDto item)
    { .. }
}

目标是只有完全访问权限的用户可以保存数据......

问题)现在在我的处理程序中,当用户单击保存时,我收到 3 个角色,而不是 1 个。

这是我的处理程序

public class RoleRequirementHandler : IAuthorizationHandler
{
    public Task HandleAsync(AuthorizationHandlerContext context)
    {
        var succeed = false;

        var pendingRequirements = context.PendingRequirements.ToList();

        var requiredRoles = new List<RoleRequirement>();

        foreach (var x in pendingRequirements)
        {
            requiredRoles.AddRange(((RolesAuthorizationRequirement)x).AllowedRoles.Select(x => new RoleRequirement(x)).ToList());
        }

        foreach (var x in requiredRoles)
        {
            if (x is RoleRequirement)
            {
                var prefix = "APPT"; // future from setting file

                if (context.User.IsInRole(prefix + ((RoleRequirement)x).Role))
                {
                    succeed = true;
                }
            }

        };

        if (succeed)
        {
            pendingRequirements.ForEach(x => context.Succeed(x));
        }
     

        return Task.CompletedTask;
    }
}

它只适用于一个角色,但如果使用以前的 Edit 方法,Handler 会获得 3 个角色,并且无法通过它进行处理。

.....................

添加策略如下所示:

options.AddPolicy(Roles.Full,
                policy => policy.Requirements.Add(new RoleRequirement(Roles.Full)));

对于每一个角色,

我也在使用 Cookie 身份验证方案

我会感谢任何建议:)

标签: c#.netasp.net-core.net-coreauthorization

解决方案


这将在角色中使用“and”条件

[Authorize(Roles = Roles.Full)]
[Authorize(Roles = Roles.Read)]

这将使用“或”

[Authorize(Roles = "Full,Read")]

在控制器上,您尝试像这样指定或条件

[Authorize(Roles = "Full,Read")]

推荐阅读