相关疑难解决方法(0)

将JWT声明添加为数组?

使用thinktecture JWT身份验证资源所有者流,我使用JWT的声明部分来进行客户端使用.我的问题是,如果它可以在身份服务器中添加声明并将其解码为客户端中的数组.

数组类型没有ClaimTypeValues.

作为一种解决方法,

 var user = IdentityServerPrincipal.Create(response.UserName, response.UserName);
                user.Identities.First().AddClaims(
                                            new List<Claim>()
                                        {
                                            new Claim(ClaimTypes.Name, response.UserName),
                                            new Claim(ClaimTypes.Email, response.Email),
                                            new Claim(FullName, response.FullName),
                                            new Claim(AuthorizedCompanies,JsonConvert.SerializeObject(response.AuthorizedCompanies))
                                        });
                return new AuthenticateResult(user);
Run Code Online (Sandbox Code Playgroud)

我将声明添加为json数组来声明AuthorizedCompanies并在客户端解析它.如果有的话,这里的设计模式是什么?

claims-based-identity jwt thinktecture-ident-server

14
推荐指数
3
解决办法
1万
查看次数

JWT的复杂索赔

智威汤逊RFC似乎并不具有包含复杂阵列,如任何问题:

{
    "email": "test@test.com",
    "businesses": [
        {
            "businessId": "1",
            "businessName": "One",
            "roles": [
                  "admin",
                  "accountant"
            ]
        },
        {
            "businessId": "2",
            "businessName": "Two",
            "roles": [
                  "support"
            ]
        }
     ]
}
Run Code Online (Sandbox Code Playgroud)

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

我已经看到,与IdentityServer4索赔被添加到ProfileDataRequestContextIEnumerable<Claim> IssuedClaims财产.

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

PS:我已经看到了这个问题另一个问题,其中一个Identity Server的作者谈到了类似的反模式.不确定反模式是否在索赔中具有复杂的索赔结构或"授权实现细节".

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

更新:

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

{
    "email": "test@test.com",
    "roles": [
        "1_admin",
        "1_accountant",
        "2_support"
     ],
     "businesses": [
        "1_One",
        "2_Two" 
     ]
}
Run Code Online (Sandbox Code Playgroud)

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

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

claims jwt identityserver4

5
推荐指数
1
解决办法
2548
查看次数