226 votes

Comment décoder le jeton JWT?

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

Il s'agit d'erreur :

La chaîne doit être compact de format JSON, qui est de la forme: Base64UrlEncodedHeader.Base64UrlEndcodedPayload.En OPTION,Base64UrlEncodedSignature'.

Si vous copiez des flux de jwt.io site web, il fonctionne très bien :)

Merci d'avance pour votre aide !

382voto

Cooxkie Points 1313

J'ai trouvé la solution, j'ai juste manqué de Cast résultat comme suit:

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

Après que je puisse obtenir des réclamations comme:

  var jti = tokenS.Claims.First(claim => claim.Type == "jti").Value;
 

63voto

dpix Points 415

new JwtSecurityTokenHandler().ReadToken("") retournera un SecurityToken

new JwtSecurityTokenHandler().ReadJwtToken("") retournera un JwtSecurityToken

Si vous ne faites que modifier la méthode que vous utilisez, vous pouvez éviter la conversion dans la réponse ci-dessus.

39voto

Pato Milán Points 41

Vous avez besoin de la chaîne secrète utilisée pour générer le jeton de chiffrement. 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;
    }
 

19voto

En utilisant les packages .net core jwt, les revendications 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;
    }
}
 

3voto

TamerDev Points 31

S'étendant sur cooxkie réponse, et la cascade dpix de réponse, lorsque vous lisez un jwt jeton (comme un access_token reçu à partir d'AD FS), vous pouvez fusionner les revendications de la jwt jeton avec les revendications de "contexte.AuthenticationTicket.L'identité" qui ne pourrait pas avoir le même ensemble de revendications comme le jwt jeton.

Pour Illustrer, dans un Code d'Authentification de l'écoulement en utilisant OpenID Connect,après qu'un utilisateur est authentifié, vous pouvez gérer l'événement SecurityTokenValidated qui vous fournit un contexte d'authentification, vous pouvez l'utiliser pour lire l'access_token comme un jwt jeton, alors vous pouvez "fusionner" les jetons qui sont dans l'access_token avec la liste standard de demandes reçues dans le cadre de l'identité de l'utilisateur:

    private Task OnSecurityTokenValidated(SecurityTokenValidatedNotification<OpenIdConnectMessage,OpenIdConnectAuthenticationOptions> context)
    {
        //get the current user identity
        ClaimsIdentity claimsIdentity = (ClaimsIdentity)context.AuthenticationTicket.Identity;

        /*read access token from the current context*/
        string access_token = context.ProtocolMessage.AccessToken;

        JwtSecurityTokenHandler hand = new JwtSecurityTokenHandler();
        //read the token as recommended by Coxkie and dpix
        var tokenS = hand.ReadJwtToken(access_token);
        //here, you read the claims from the access token which might have 
        //additional claims needed by your application
        foreach (var claim in tokenS.Claims)
        {
            if (!claimsIdentity.HasClaim(claim.Type, claim.Value))
                claimsIdentity.AddClaim(claim);
        }

        return Task.FromResult(0);
    }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X