Comment décoder JWT Token?

je ne comprends pas comment cette bibliothèque fonctionne. Pourriez-vous m'aider s'il vous plaît ?

Voici mon code simple :

public void TestJwtSecurityTokenHandler()
    {
        var stream =
            "eyJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJJU1MiLCJzY29wZSI6Imh0dHBzOi8vbGFyaW0uZG5zY2UuZG91YW5lL2NpZWxzZXJ2aWNlL3dzIiwiYXVkIjoiaHR0cHM6Ly9kb3VhbmUuZmluYW5jZXMuZ291di5mci9vYXV0aDIvdjEiLCJpYXQiOiJcL0RhdGUoMTQ2ODM2MjU5Mzc4NClcLyJ9";
        var handler = new JwtSecurityTokenHandler();

        var jsonToken = handler.ReadToken(stream);
    }

ceci est une erreur:

la chaîne doit être au format compact JSON, qui est de la forme: Base64UrlEncodedHeader.Base64UrlEndcodedPayload.Facultatif, Base64UrlEncodedSignature".

si vous copiez stream dans jwt.io website, il fonctionne très bien :)

Merci d'avance pour votre aide !

38
demandé sur Cooxkie 2016-07-13 01:52:03

4 réponses

j'ai trouvé la solution, je viens de manquer de mouler le résultat comme suit:

var tokenS = handler.ReadToken(tokenJwtReponse.access_token) as JwtSecurityToken;

Après je peux obtenir des déclarations comme :

 var jti = tokenS.Claims.First(claim => claim.Type == "jti").Value;
59
répondu Cooxkie 2016-08-12 06:47:43

new JwtSecurityTokenHandler().ReadToken("") retour SecurityToken

new JwtSecurityTokenHandler().ReadJwtToken("") retour JwtSecurityToken

Si vous modifiez simplement la méthode que vous utilisez, vous pouvez éviter la fonte dans la réponse ci-dessus

4
répondu dpix 2018-07-11 05:50:54

Vous avez besoin de la chaîne secrète qui a été utilisée pour générer un token crypté. Ce code fonctionne pour moi:

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;
    }
2
répondu Pato Milán 2018-08-30 13:10:19

en utilisant les paquets .net core jwt, les Claims sont disponibles:

[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;
    }
}
0
répondu jenson-button-event 2018-08-08 09:11:47