首页 文章

动态授权角色 asp.net 核心

提问于
浏览
3

这不是一个重复的问题,或者说其他解决方案中给出的解决方案没有奏效。

让我们说有一个 cntroller

[Authorize(Roles=//set dynamically)]
public IActionResult DashBoard(LoginModel model)
{
}

我在以下问题中尝试了解决方案

  1. 添加角色以授权属性

  2. 动态为角色分配控制器操作权限

  3. 动态添加角色以授权控制器的属性(错误:句柄方法 - 找不到合适的方法来覆盖)

  4. 基于策略的授权可以更具动态性

所有这些解决方案都不起作用,因为接口中覆盖的方法不存在(例如,authorizeAttribute 不包含 AuthorizeCore 的定义),或者在某些情况下,IServiceCollection 服务不包含特定方法

1 回答

  • 7

    你不能这样做。 [Authorize(Roles=//set dynamically)]必须在编译时知道。出于这个原因也使用角色是气馁,如评论中的 blowdart 链接帖子所指出的那样。

    相反,您应该使用声明和政策。声明是细粒度的权限,例如“CreateCustomer”或“DeleteCustomer”或“ViewDashboard”。

    所以你必须像使用它一样

    [Authorize(Policy = "ViewDashboard")]
    

    这些策略需要在编译时知道。

    public class ViewDashboardRequirement : AuthorizationHandler<ViewDashboardRequirement>, IAuthorizationRequirement
    {
        public override void Handle(AuthorizationContext context, ViewDashboardRequirement requirement)
        {
            if (context.User.HasClaim(c => c.Type == "dashboard:read"))
            {
                context.context.Succeed(requirement);
                return;
            }
    
            // only call fail if you do not want that other AuthorizationHandler may succeed with 
            // a different requirement
            // context.Fail();
        }
    }
    

    有关如何生成通用处理程序(而不是为每个策略编写新的 Handler)的示例,请参阅我的答案这里

    这将允许您创建可配置的角色。现在,您可以创建包含一系列声明的角色。每项索赔可能是一项政策。当用户登录时,您将属于角色的声明添加到用户声明列表中。

    i.e。

    • 支持:ViewDashboard,ViewCustomers,ViewContacts,ManageCases(支持票证)

    • 经理:ViewDashboard,ManageCustomers(查看,编辑,删除),ManageContacts(查看,编辑,删除)

    • 管理员:ManageDashboard(查看,编辑)

    等等

    从评论更新。

    您应该能够利用 ASP.NET Core Identity 的声明和 rolalaim 能力 w/o 更改一行代码,因此您拥有IdentityRoleIdentityRoleClaim类。在运行时,添加一个新的IdentityRole(i.e.“Manager”),然后添加多个IdentityRoleClaim(每个 permission/policy 一个)

相关问题