具有ASP.NET Core 2.1身份的基于权限的授权

时间:2018-08-16 18:27:28

标签: asp.net-core asp.net-core-2.1 asp.net-core-identity

过去,使用.NET Framework上的ASP.NET MVC,我总是在内置的基于角色的授权之上实现基于权限的授权层。所谓“基于权限”,是指为每个角色分配了枚举的权限列表,并且在运行时,每个调用都检查了权限,而不是角色。

例如例如说OrdersController上的Post方法需要AddOrEditOrder权限。在Post操作上看起来像[MyAuthorize(MyRights.AddOrEditOrder)]。然后在其他地方,您可以配置只有Manager和CustomerRep角色才具有该权限。

我一直认为这个小抽象层易于实现,并且极大地改善了可维护性,即使角色权限映射仅从配置文件而不是UI进行更新。来自IMO,这是基于Windows的IT设置。

但是,转到ASP.NET Core Identity,我们对Claims有了所有这些新奇的幻想。现在,我意识到要求和权利根本不是一回事。但是,您可以使用Claims并将其分配给Roles并有效地完成我在上面描述的事情吗?

它基于数据库架构出现,您可以将Claims分配给Roles,并且可以将Roles分配给Users。因此,从理论上讲,将声明“ AddOrEditOrder”同时添加到“经理”和“ CustomerRep”角色中将可以完成我的想法。然后我将[Authorize("AddOrEditOrder")]放在OrdersController的Post操作上,然后中提琴就可以了!...对吗?

我可以在没有严重冒犯的情况下以这种方式使用“声明和角色”吗?

编辑:使用政策,而不是声明

  

正如@ Ruard-van-Elburg给出的有帮助的答案所建议的那样,我错误地写了“ Claims”,意思是“政策”。用一个替换另一个,我说的一切都奏效。 “权利”的另一个词是“权限”,在此相关问题及其最高答案中有一些非常有用的建议:How to implement Permission Based Access Control with Asp.Net Core

1 个答案:

答案 0 :(得分:2)

这不是应使用索赔的方式。声明应该模拟用户的身份,而不是权限。请阅读文章Identity vs Permissions以获得一些解释。

您可以使用policies

public void ConfigureServices(IServiceCollection services)
{
    services.AddAuthorization(options =>
    {
        options.AddPolicy("AddOrEditOrder", policy =>
            policy.RequireRole("Manager", "CustomerRep"));
    });
}

并使用相同的属性:

[Authorize("AddOrEditOrder")]

还有许多其他选项可以添加authorization。您还可以查看PolicyServer