简体   繁体   English

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

[英]Passing JSON Object as a claim of JWT Token in ASP.NET Core 2.0

Is it possible to pass a JSON object as a claim of JWT Token or list of objects (like shown on below example)?是否可以将 JSON 对象作为 JWT 令牌或对象列表的声明传递(如下例所示)?

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

So far I can only pass one nickname in token到目前为止,我只能在令牌中传递一个昵称

"nickname" : "tomas"

Or I can pass an array或者我可以传递一个数组

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

But none of these satisfies me.但这些都不能让我满意。

EDIT:编辑:

Using Avin Kavish approach I got extra slashes in JSON Object.使用 Avin Kavish 方法,我在 JSON 对象中得到了额外的斜线。 I don't want them.我不想要他们。 How to get rid of them?如何摆脱它们?

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

Yes, serialize it first.是的,先序列化它。

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

In order to use the nicknames, you need to deserialize from a string back to a plain old object.为了使用昵称,您需要将字符串反序列化回普通的旧对象。

In javascript,在 JavaScript 中,

const nicknames = JSON.Parse(value)

In C#,在 C# 中,

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

I use JWT NuGet package.我使用 JWT NuGet 包。

Install-Package JWT 

the code:编码:

        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");

If you look at the underlying structures you will find that the JWTPayload class inherits from Dictionary<string,object> .如果您查看底层结构,您会发现JWTPayload类继承自Dictionary<string,object> Once we know that, the rest is easy:一旦我们知道了,剩下的就很容易了:

// 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;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM