过去,使用.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
答案 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。