web-dev-qa-db-fra.com

JwtSecurityTokenHandler et TokenValidationParameters

J'avais l'habitude d'avoir une référence à Microsoft.IdentityModel.Tokens.JWT et tout fonctionnait bien.

J'ai mis à jour pour utiliser le nouveau System.IdentityModel.Tokens.Jwt mais rien ne semble fonctionner maintenant. Il ne peut pas trouver la méthode ValidateToken des JwtSecurityTokenHandler et les TokenValidationParameters n'ont pas de propriétés AllowedAudience, SigningToken ou ValidateExpiration .

Qu'est-ce que j'oublie ici? Quelqu'un peut-il fournir un échantillon de travail d'une validation JWT avec cela?

Mon "ancien" code:

private static void ValidateJwt(string jwt)
{
    var handler = new JWTSecurityTokenHandler();
    var validationParameters = new Microsoft.IdentityModel.Tokens.JWT.TokenValidationParameters()
    {
        AllowedAudience = "https://my-rp.com",
        //SigningToken = new BinarySecretSecurityToken(Convert.FromBase64String(myBase64Key)),
        SigningToken = new X509SecurityToken(
           X509
           .LocalMachine
           .My
           .Thumbprint
           .Find("UYTUYTVV99999999999YTYYTYTY88888888", false)
           .First()),
        ValidIssuer = "https://my-issuer.com/trust/issuer",
        ValidateExpiration = true
    };

    try
    {
        var principal = handler.ValidateToken(jwt, validationParameters);
    }
    catch (Exception e)
    {

        Console.WriteLine("{0}\n {1}", e.Message, e.StackTrace);
    }

    Console.WriteLine();
}
19
Patrice Cote

Après beaucoup de recherches et de tests, j'ai finalement trouvé que certains noms de propriétés pour TokenValidationParameters avaient changé et la signature de la méthode JwtSecurityTokenHandler.ValidateToken() aussi.

Voici donc la version de travail modifiée du code ci-dessus.

private static void ValidateJwt(string jwt)
{
    var handler = new JwtSecurityTokenHandler();   
    var validationParameters = new TokenValidationParameters()
    {
        ValidAudience = "https://my-rp.com",
        IssuerSigningTokens = new List<X509SecurityToken>() { new X509SecurityToken(
           X509
           .LocalMachine
           .My
           .Thumbprint
           .Find("UYTUYTVV99999999999YTYYTYTY88888888", false)
           .First()) },
        ValidIssuer = "https://my-issuer.com/trust/issuer",
        CertificateValidator = X509CertificateValidator.None,
        RequireExpirationTime = true
    };

    try
    {
        SecurityToken validatedToken;
        var principal = handler.ValidateToken(jwt, validationParameters, out validatedToken);
    }
    catch (Exception e)
    {

        Console.WriteLine("{0}\n {1}", e.Message, e.StackTrace);
    }

    Console.WriteLine();
}

Et pour référence, le JwtSecurityTokenHandler vit dans le System.IdentityModel.Tokens espace de noms. N'oubliez pas d'ajouter le package " Gestionnaire de jetons Web JSON pour Microsoft .Net Framework 4.5 " (version 4.0.0 au moment où j'écris ces lignes).

J'espère que cela peut sauver quelques heures de recherche pour certains d'entre vous!

36
Patrice Cote