System.IdentityModel.Tokens.JwtSecurityToken 自定义属性

Posted

技术标签:

【中文标题】System.IdentityModel.Tokens.JwtSecurityToken 自定义属性【英文标题】:System.IdentityModel.Tokens.JwtSecurityToken custom properties 【发布时间】:2017-05-17 22:28:47 【问题描述】:

我的 AuthServer 目前正在使用以下代码生成 JwtSecurityToken:

var token = new JwtSecurityToken(_issuer, audienceId, data.Identity.Claims, issued.Value.UtcDateTime, expires.Value.UtcDateTime, signingKey);
var handler = new JwtSecurityTokenHandler();
var jwt = handler.WriteToken(token);

有效载荷如下所示:


  "unique_name": "myUserName",
  "sub": "myUserName",
  "role": "API_User",
  "iss": "Automation",
  "aud": "099153c2625149bc8ecb3e85e03f0022",
  "exp": 1486056731,
  "nbf": 1483464731

我想在令牌负载中添加一些自定义字段/属性,例如 ProfilePicURL,以便负载看起来像这样:


  "unique_name": "myUserName",
  "sub": "myUserName",
  "role": "API_User",
  "iss": "Automation",
  "aud": "099153c2625149bc8ecb3e85e03f0022",
  "exp": 1486056731,
  "nbf": 1483464731,
  "profilePicture": "http://url/user.jpg"

如何添加这些自定义属性并确保令牌包含它们?

【问题讨论】:

将其添加到派生自Dictionary<string, object>token.Payload["profilePicture"] = "http://url/user.jpg"的Payload属性中 【参考方案1】:

JwtSecurityToken 公开了一个 JwtPayload Payload get; set; 属性。 JwtPayload 派生自 Dictionary<string, object> 所以只需将其添加到有效负载...

var token = new JwtSecurityToken(_issuer, audienceId, data.Identity.Claims, issued.Value.UtcDateTime, expires.Value.UtcDateTime, signingKey);
token.Payload["profilePicture"] = "http://url/user.jpg"
var handler = new JwtSecurityTokenHandler();
var jwt = handler.WriteToken(token);

使用WriteToken 对令牌进行编码和签名很重要,因为简单地获取RawData 属性将不起作用(令牌将不包含自定义声明)。

【讨论】:

谢谢!!在任何地方都找不到这个,不知道这是一本可以编辑的字典!

以上是关于System.IdentityModel.Tokens.JwtSecurityToken 自定义属性的主要内容,如果未能解决你的问题,请参考以下文章