#.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 фиксированной длины.