2014-09-05 11 views
15

Avevo un riferimento a Microsoft.IdentityModel.Tokens.JWT e tutto funzionava correttamente.JwtSecurityTokenHandler e TokenValidationParameters

Ho aggiornato per utilizzare il nuovo System.IdentityModel.Tokens.Jwt ma nulla sembra funzionare ora. Non riesce a trovare il metodo ValidateToken dello JwtSecurityTokenHandler e lo TokenValidationParameters non ha AllowedAudience, SigningToken o ValidateExpiration proprietà.

Cosa mi manca qui? Qualcuno può fornire un esempio funzionante di una convalida JWT con questo?

Il mio codice "vecchio":

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

risposta

29

Dopo un sacco di ricerca e test, ho finalmente scoperto che alcune proprietà nomi per TokenValidationParameters erano cambiate e JwtSecurityTokenHandler.ValidateToken() firma del metodo troppo.

Quindi, ecco la versione di lavoro modificata del codice precedente.

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

E per il riferimento, i JwtSecurityTokenHandler vive nel System.IdentityModel.Tokens namespace. Non dimenticare di aggiungere il pacchetto "JSON Web Token Handler For the Microsoft .Net Framework 4.5" (versione 4.0.0 al momento in cui scrivo queste righe).

Spero che possa risparmiare qualche ora di ricerca per alcuni di voi ragazzi!

+1

Grazie per questo! Ugh, così frustrante: \ Coding in ASP.NET è stato un incubo assoluto rispetto ad altri framework laggiù – ossys

+0

Felice di averlo aiutato! –

+0

@ossys Forse è solo la parte di Azure? Ho usato ASP.NET per un po 'e lo adoro. Devo fare le cose Azure AD ora ed è un dolore nella parte posteriore. – Shelby115