首页 文章

使用ASP.NET Core 2.1 Identity进行基于权限的授权

提问于
浏览
2

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

例如说OrdersController上的Post方法需要AddOrEditOrder Right . 在Post动作上看起来像 [MyAuthorize(MyRights.AddOrEditOrder)] . 然后在其他地方你可以配置只有Manager和CustomerRep Roles才有这个权利 .

我一直认为这个小抽象层易于实现并且大大提高了可维护性,即使权限到角色的映射只是从配置文件而不是UI更新 . 来自基于Windows的IT设置,这只是“如何正确完成”,IMO .

但是,转向ASP.NET核心身份,我们拥有了索赔所带来的所有新奇感 . 现在,我意识到索赔与权利完全没有相同之处 . 但是,您可以使用声明,将它们分配给角色,并有效地完成我上面描述的内容吗?

它基于您可以分配声明为角色的数据库架构,并且您可以将角色分配给用户 . 因此,从理论上讲,将"AddOrEditOrder"声明添加到"Manager"和"CustomerRep"角色将会执行'm thinking. Then I'刚刚将 [Authorize("AddOrEditOrder")] 放在OrdersController的Post动作上,而中提琴,它会起作用!...对吗?

如果没有严重的sanfus,我可以这样使用Claim和Roles吗?

编辑:使用政策,而不是索赔

正如@ Ruard-van-Elburg的有用答案所暗示的那样,我错误地写了“声明”,我的意思是“政策” . 用一个代替另一个,我说的一切都有效 . “权限”的另一个词是“权限”,在这个相关问题及其最佳答案中有一些非常有用的建议:如何使用Asp.Net Core实现基于权限的访问控制

1 回答

  • 1

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

    在您的情况下,您可以使用policies .

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

    并使用相同的属性:

    [Authorize("AddOrEditOrder")]
    

    还有许多其他选项可以添加authorization . 你也可以看一下PolicyServer .

相关问题