在 ASP.NET Core 2.0 中传递 JSON 对象作为 JWT Token 的声明

问题描述 投票:0回答:5

是否可以将 JSON 对象作为 JWT 令牌或对象列表的声明传递(如下例所示)?

{
  "nickname": [
    {
      "external_nickname": "tomas",
      "internal_nickname": "t_omas"
    }, 
    {
      "external_nickname": "malex",
      "internal_nickname": "alexander014"
    } 
  ]
}

到目前为止我只能在token中传递一个昵称

"nickname" : "tomas"

或者我可以传递一个数组

"nickname" : ["nickname1","nickname2"]

但这些都不能让我满意。

编辑:

使用 Avin Kavish 方法,我在 JSON 对象中得到了额外的斜杠。我不想要他们。如何摆脱它们?

 "nickname": "[{\"external_nickname\":\"tomas\",\"internal_nickname\":\"t_omas\"}]"
c# asp.net-core jwt
5个回答
7
投票

对于那些使用asp.net core的人来说,这真的很简单。声明对象有一个附加参数。

new Claim("json", "{\"sample\":{\"sample\":\"value\"}}", JsonClaimValueTypes.Json)

JsonClaimValueTypes 是 System.IdentityModel.Tokens.Jwt 的一部分


3
投票

如果你查看底层结构,你会发现

JWTPayload
类继承自
Dictionary<string,object>
。一旦我们知道了这一点,剩下的就很容易了:

// Build the claims list somehow, may contain nested objects
// NOTE: any nested data must be JSON-serializable!
Dictionary<string,object> claims = BuildMeThatClaimsList();

// Add all claims manually because the CTORs only accept string values
var token = new JwtSecurityToken(issuer, audience, Array.Empty<Claim>(), notBefore, expires, signingCreds);
foreach (var pair in claims)
  token.Payload.Add(pair.Key, pair.Value);
return token;

2
投票

我使用 JWT NuGet 包。

Install-Package JWT 

代码:

        var payload = new
        {
            nickname = new[]
            {
                new {external_nickname = "tomas", internal_nickname = "t_omas"},
                new {external_nickname = "malex", internal_nickname = "alexander014"}
            }
        };
        
        var encoder = new JwtEncoder(new HMACSHA256Algorithm(), new JsonNetSerializer(), new JwtBase64UrlEncoder());
        var token = encoder.Encode(payload, "your_secret");

1
投票

是的,先序列化。

var claim = new Claim("nickname", JsonConvert.SerializeObject(nicknames));

为了使用昵称,您需要将字符串反序列化回普通的旧对象。

在 JavaScript 中,

const nicknames = JSON.Parse(value)

在 C# 中,

var nicknames = JsonConvert.DeserializeObject<T>(value) // <-- where T is your type

0
投票

我知道这个问题可能有点老了,您可以将 JsonClaimValueTypes.Json 作为 valuetype 传递给新声明,这将正确形成 json 对象,此 json valuetype 位于“System.IdentityModel.Tokens.Jwt”命名空间下

例如: Claims.Add(new Claim( "Key", ,JsonClaimValueTypes.Json));

© www.soinside.com 2019 - 2024. All rights reserved.