Как декодировать токен JWT?
Я не понимаю, как работает эта библиотека. Не могли бы вы мне помочь, пожалуйста ?
Вот мой простой код:
public void TestJwtSecurityTokenHandler() { var stream = "eyJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJJU1MiLCJzY29wZSI6Imh0dHBzOi8vbGFyaW0uZG5zY2UuZG91YW5lL2NpZWxzZXJ2aWNlL3dzIiwiYXVkIjoiaHR0cHM6Ly9kb3VhbmUuZmluYW5jZXMuZ291di5mci9vYXV0aDIvdjEiLCJpYXQiOiJcL0RhdGUoMTQ2ODM2MjU5Mzc4NClcLyJ9"; var handler = new JwtSecurityTokenHandler(); var jsonToken = handler.ReadToken(stream); }
Это ошибка:
- Лучший тип заголовка HTTP-авторизации для JWT
- JWT на .NET Core 2.0
- Аутентификация JWT для Asp.Net Web Api
- Если вы можете декодировать JWT, как они защищены?
- Как получить JWT?
Строка должна быть в компактном формате JSON, который имеет форму: Base64UrlEncodedHeader.Base64UrlEndcodedPayload.OPTIONAL, Base64UrlEncodedSignature ‘.
Если вы копируете stream на веб-сайте jwt.io , он отлично работает 🙂
Заранее спасибо за вашу помощь !
- JWT (JSON Web Token) автоматическое продление срока действия
- JSON Web Token (JWT) с основанной на Spring SockJS / STOMP Web Socket
- Недействительный сеанс JWT на стороне клиента
- RS256 против HS256: В чем разница?
- Декодирование и проверка токена JWT с использованием System.IdentityModel.Tokens.Jwt
- Где хранить JWT в браузере? Как защитить от CSRF?
Я нашел решение, я просто пропустил результат Cast, как показано ниже:
var tokenS = handler.ReadToken(tokenJwtReponse.access_token) as JwtSecurityToken;
После того, как я получу претензии:
var jti = tokenS.Claims.First(claim => claim.Type == "jti").Value;
new JwtSecurityTokenHandler().ReadToken("")
вернет SecurityToken
new JwtSecurityTokenHandler().ReadJwtToken("")
вернет JwtSecurityToken
Если вы просто измените метод, который используете, вы можете избежать приведения в приведенном выше ответе
Вам нужна секретная строка, которая использовалась для создания токена шифрования. Этот код работает для меня:
protected string GetName(string token) { string secret = "this is a string used for encrypt and decrypt token"; var key = Encoding.ASCII.GetBytes(secret); var handler = new JwtSecurityTokenHandler(); var tokenSecure = handler.ReadToken(token) as SecurityToken; var validations = new TokenValidationParameters { ValidateIssuerSigningKey = true, IssuerSigningKey = new SymmetricSecurityKey(key), ValidateIssuer = false, ValidateAudience = false }; var claims = handler.ValidateToken(token, validations, out tokenSecure); return claims.Identity.Name; }
Используя пакеты .net core jwt, претензии доступны:
[Route("api/[controller]")] [ApiController] [Authorize(Policy = "Bearer")] public class AbstractController: ControllerBase { protected string UserId() { var principal = HttpContext.User; if (principal?.Claims != null) { foreach (var claim in principal.Claims) { log.Debug($"CLAIM TYPE: {claim.Type}; CLAIM VALUE: {claim.Value}"); } } return principal?.Claims?.SingleOrDefault(p => p.Type == "username")?.Value; } }