JWT 中的复杂声明

Complex claims in JWT

JWT RFC包含复杂数组好像没有任何问题如:

{
    "email": "test@test.com",
    "businesses": [
        {
            "businessId": "1",
            "businessName": "One",
            "roles": [
                  "admin",
                  "accountant"
            ]
        },
        {
            "businessId": "2",
            "businessName": "Two",
            "roles": [
                  "support"
            ]
        }
     ]
}

这似乎是满足我们需求的理想场景,因为作为令牌的一部分,我们希望有一个用户可以访问的企业列表以及他对每个企业有什么角色(这是它的一部分身份)。 API 的授权策略稍后会理解这些组并应用所需的授权逻辑。

我已经看到使用 IdentityServer4,声明被添加到 ProfileDataRequestContextIEnumerable<Claim> IssuedClaims 属性。

对于这种复杂的索赔结构,是否有推荐的替代方案?如果没有,是否有任何方法可以使用 IdentityServer4 构建该结构(也许是一些扩展?),或者唯一的方法是手动序列化 JSON 因为 Claim 似乎只接受一个字符串?

PS:我看到 this question and this other Identity Server 的一位作者谈到了类似的反模式。不确定反模式是否具有复杂的声明结构或声明中的“授权实施细节”。

对此有任何建议都很棒!

更新:

在给出一些想法后,我同意拥有复杂的声明层次结构是不可取的,我可以使用为每个 businessId 添加前缀角色的肮脏解决方案来解决这个问题。像这样:

{
    "email": "test@test.com",
    "roles": [
        "1_admin",
        "1_accountant",
        "2_support"
     ],
     "businesses": [
        "1_One",
        "2_Two" 
     ]
}

这样我就保持了一个简单的结构,稍后,在客户端或 API 我可以阅读声明并发现 1 是名称为 [=15 的企业的 ID =] 并且它具有角色 adminaccount.

这会是更好的解决方案吗?

声明是关于身份信息的 - 而不是复杂的许可 "objects"。您最好使用专门的权限服务,returns 您可以根据用户的身份以任何格式获得权限。

我也希望您的权限数据在使用令牌时不会更改,否则您最终会得到陈旧的数据。

也就是说 - 声明在 .NET 中始终是字符串 - 但您可以通过将 ClaimValueType 设置为 IdentityServerConstants.ClaimValueTypes.Json 来将 JSON 对象序列化到其中。