首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么JWT长度会超过?我们能处理吗?

为什么JWT长度会超过?我们能处理吗?
EN

Stack Overflow用户
提问于 2021-12-07 12:35:54
回答 1查看 186关注 0票数 1

这是我生成JWT的代码。

代码语言:javascript
运行
复制
//create security token handler
var tokenHandler = new JwtSecurityTokenHandler();
//create byte array of token key
var key = Encoding.ASCII.GetBytes(tokenKey);
//create token descriptor
var tokenDescriptor = new SecurityTokenDescriptor()
{
     Subject = new ClaimsIdentity(new Claim[]{
     new Claim(ClaimTypes.Name,username),
     new Claim(ClaimTypes.Role,myrole),
     new Claim(ClaimTypes.Email,myemail) }),
 
     NotBefore = DateTime.UtcNow,
     Expires = DateTime.UtcNow.AddMinutes(1),
     SigningCredentials = new SigningCredentials(
     new SymmetricSecurityKey(key),
            SecurityAlgorithms.HmacSha256)
 };
 var securityToken = tokenHandler.CreateToken(tokenDescriptor);
 var JWTtoken = tokenHandler.WriteToken(securityToken);   // this is my JWT.

上面的代码为我生成了访问令牌,我可以使用它访问服务器资源。当我想刷新令牌时,我使用声明来生成新的JWT。

以下是我用于刷新/生成新JWT的代码。

代码语言:javascript
运行
复制
var key = Encoding.ASCII.GetBytes(tokenKey);
var principle = tokenHandler.ValidateToken(token.Value,
new TokenValidationParameters()
{
      ValidateIssuerSigningKey = true,
      IssuerSigningKey = new SymmetricSecurityKey(key),
      ValidateIssuer = false,
      ValidateAudience = false,
      ValidateLifetime = false
  }, out validatedToken);

以上代码验证我的过期令牌并返回原则。我在这个原则中使用声明来生成新的JWT。

代码语言:javascript
运行
复制
var jwtSecurityToken = new JwtSecurityToken(
            claims: principle.Claims.ToArray(),
            notBefore: DateTime.UtcNow,
            expires: DateTime.UtcNow.AddMinutes(1),
            signingCredentials: new SigningCredentials(
                                new SymmetricSecurityKey(key),
                                SecurityAlgorithms.HmacSha256)
            );

 var newToken = new JwtSecurityTokenHandler().WriteToken(jwtSecurityToken);

此新令牌的长度超过以前的令牌。

代码语言:javascript
运行
复制
 length of first token is 297
 length of new token is 516

我观察到新令牌中的索赔名是对有效负载中的web地址的更改。

第一项申索

代码语言:javascript
运行
复制
 "unique_name": "user1",
 "role": "Admin",
 "email": "Email",

以新令牌提出的索赔

代码语言:javascript
运行
复制
"http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name": "user1",
"http://schemas.microsoft.com/ws/2008/06/identity/claims/role": "Admin",
"http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress": "Email"
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-12-07 13:54:07

微软和OAuth/OpenIDConnect对索赔名称有不同的看法,所以当您的.NET代码收到令牌时,它将自动重命名一些索赔。

禁用此映射的一种方法是使用以下方法清除映射:

代码语言:javascript
运行
复制
// By default, Microsoft has some legacy claim mapping that converts
// standard JWT claims into proprietary ones. This removes those mappings.
JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();
JwtSecurityTokenHandler.DefaultOutboundClaimTypeMap.Clear();

这种声明的重命名是你必须要注意的事情,这不是一个bug。这只是生活中的一个事实,你必须接受和工作。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70260240

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档