首页 文章

JWT的复杂索赔

提问于
浏览
5

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 questionthis other,其中一位Identity Server的作者谈到了类似的反模式 . 不确定反模式是否会在索赔中具有复杂的索赔结构或"authorization implementation details" .

对此的任何建议都会很棒!

UPDATE:

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

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

这样我保持一个简单的结构,稍后,在客户端或API我可以阅读声明,并发现 1 是名为 One 的业务的ID,它具有 adminaccount 的角色 .

Would this be a better solution?

1 回答

  • 7

    声明涉及身份信息 - 而不是复杂的权限“对象” . 使用专用权限服务可以获得更好的效果,该服务根据用户的身份以您想要的任何格式返回您的权限 .

    我也希望在使用令牌时你的权限数据不会改变,否则你最终会得到过时的数据 .

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

相关问题