不同部门如何实施同一个索赔

How to implement the same claim for different departments

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

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

例如:

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 中可能行不通,因此我愿意转移到内存缓存(或类似缓存)中。

我怎样才能做到这一点?

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

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

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