动态授权角色asp.net核心

Suj*_*ier 4 asp.net authorize-attribute asp.net-identity role-based-access-control asp.net-core

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

让我们说有一个cntroller

[Authorize(Roles=//set dynamically)]
public IActionResult DashBoard(LoginModel model)
{
}
Run Code Online (Sandbox Code Playgroud)

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

1)添加角色以授权属性

2)动态地为角色分配控制器动作权限

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

4)基于策略的授权可以更加动态

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

Tse*_*eng 8

你不能这样做.[Authorize(Roles=//set dynamically)]必须在编译时知道.根据评论中关于blowdart的链接帖子的指示,也不鼓励使用角色.

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

所以你必须像使用它一样

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

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

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

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

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

即

  • 支持:ViewDashboard,ViewCustomers,ViewContacts,ManageCases(支持票证)
  • 经理:ViewDashboard,ManageCustomers(查看,编辑,删除),ManageContacts(查看,编辑,删除)
  • 管理员:ManageDashboard(查看,编辑)

等等

从评论更新.

您应该能够利用ASP.NET Core Identity的声明和roleclaim功能,而无需更改一行代码,因此您拥有IdentityRole和IdentityRoleClaim类.在运行时,您添加一个新的IdentityRole(即"管理器"),然后添加多个IdentityRoleClaim(每个权限/策略一个)


归档时间:

查看次数:

6544 次

最近记录:

6 年,11 月 前