Почему длина JWT превышена ? сможем ли мы с этим справиться?

#.net #.net-core #asp.net-web-api #jwt

#.net #.net-ядро #asp.net-веб-api #агентство jwt

Вопрос:

Это мой код для создания JWT.

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

 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.

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

Длина этого нового токена превышает длину предыдущего токена.

 length of first token is 297  length of new token is 516  

Я заметил , что имена утверждений в новом токене — это изменения веб-адреса в полезной нагрузке.

Утверждения в первом токене

 "unique_name": "user1",  "role": "Admin",  "email": "Email",  

Претензии в новом токене

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

Комментарии:

1. изменение имени типа утверждения превышает длину токена. Есть какие-нибудь предложения ?

2. Откуда у вас эта ошибка?

3. Я никогда не говорил, что у меня есть ошибка или ошибка, и нигде не упоминал ни о какой ошибке. просто хочу получить предложения, как справиться с этой ситуацией. И спасибо за ваш ответ.

4. не стесняйтесь принять мой ответ, если он вам помог, или вы хотите, чтобы я кое-что прояснил ?

Ответ №1:

У Microsoft и OAuth/OpenIdConnect разные мнения о том, какими должны быть имена утверждений, поэтому, когда вы .ЧИСТЫЙ код получает токен, затем он автоматически переименует некоторые утверждения.

Один из способов отключить это сопоставление-очистить карту с помощью:

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

Это переименование утверждений-это то, о чем вы должны знать, и это не ошибка. Это просто факт жизни, который вы должны принять и обойти.

Комментарии:

1. Спасибо @Tore Нестениус. Используя эти строки кода, я могу сгенерировать JWT фиксированной длины.