代码之家  ›  专栏  ›  技术社区  ›  pbristow

使用ASP.NET Core 2.1标识的基于权限的授权

  •  2
  • pbristow  · 技术社区  · 6 年前

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

    e、 假设OrdersController上的Post方法需要AddOrEditOrder权限。看起来像是 [MyAuthorize(MyRights.AddOrEditOrder)] 在行动后。然后在其他地方,您可以配置只有Manager和CustomerRep角色才具有此权限。

    我一直认为这个小抽象层很容易实现,并且大大提高了可维护性,即使角色映射的权限只是从配置文件而不是UI中更新的。来自基于Windows的IT设置,这就是IMO所说的“正确的做法”。

    然而,转移到ASP.NET核心身份,我们有了所有这些新的想法和主张。现在,我意识到权利和主张完全不是一回事。但是,您能否使用声明,将它们分配给角色,并有效地完成我上面描述的工作?

    它基于数据库架构显示,您可以将声明分配给角色,也可以将角色分配给用户。所以,在理论上,将声明“AddOrEditOrder”添加到“Manager”和“CustomerRep”角色中可以实现我的想法。然后我就把 [Authorize("AddOrEditOrder")]

    我可以这样使用声明和角色而不必认真思考吗?

    正如@Ruard van Elburg给出的有用答案所表明的那样,我错误地写了“索赔”,我的意思是“政策”。用一个代替另一个,我说的每句话都管用。“权限”的另一个词是“权限”,在这个相关的问题及其主要答案中有一些非常有用的建议: How to implement Permission Based Access Control with Asp.Net Core

    1 回复  |  直到 6 年前
        1
  •  2
  •   Ruard van Elburg    6 年前

    这不是使用索赔的方式。声明应该模拟用户的身份,而不是权限。请看这篇文章 Identity vs Permissions 为了一些解释。

    在你的情况下你可以使用 policies

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

    并使用相同的属性:

    [Authorize("AddOrEditOrder")]
    

    还有很多其他的选择 authorization . 你也可以看看 PolicyServer .