【问题标题】:How to implement the same claim for different departments如何对不同部门实施相同的索赔
【发布时间】:2018-06-21 08:04:17
【问题描述】:

我正在构建一个使用 Windows 身份验证的 Web 应用程序,并使用来自本地数据库的角色和声明对其进行补充。一旦用户通过身份验证,我计划使用 JWT 存储此信息。

我们的组织有不同的部门,我想知道在这种情况下如何实施角色/声明。

例如:

Bob 是 A 部门和 B 部门的管理员。

按照 Bob 的原则,我如何添加反映这一点的声明。即。

bob.claims = new claim[] {

    new claim() { department = "A", role = Roles.Admin },
    new claim() { department = "B", role = Roles.Admin }
}

然后我可以这样做:

[Authorize(IsInDepartmentRole(Department: "A", Role: Roles.Admin)]

请记住,这都是伪代码。

我意识到将这些信息存储在 JWT 中可能行不通,因此我愿意转移到内存缓存(或类似的缓存)。

我怎样才能做到这一点?

【问题讨论】:

    标签: asp.net-core asp.net-identity jwt claims-based-identity


    【解决方案1】:

    您可以将此信息添加为声明,但由于声明由类型值组成,因此伪代码中的方法将不起作用。

    有一些选择,但我建议如下:

    new Claim { Type = "DepartmentRole", Value = "A;Admin" }
    

    在任何情况下,保持类型不变。该值可以拆分为A和Admin,分别对应部门和角色。您可以添加多个相同类型的声明。

    现在您可以定义策略了:

    services.AddAuthorization(options =>
    {
        options.AddPolicy("AdminOfDeptA", policy => 
                                          policy.RequireClaim("DepartmentRole", "A;Admin"));
    }
    

    authorize 属性只允许字符串作为参数,所以你的伪代码再次不起作用。但是您现在可以使用它,其中 AdminOfDeptA 是配置的策略:

    [Authorize("AdminOfDeptA")]
    

    如果您不想定义所有组合,您可能需要查看resource-based authorization

    【讨论】:

      猜你喜欢
      • 2023-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-14
      • 1970-01-01
      • 2018-09-22
      • 1970-01-01
      相关资源
      最近更新 更多