8

Sto tentando di creare un metodo di convalida del token che restituisce true se un token JWT è valido in base alla firma. Non penso di aver davvero bisogno di convalidare tutto nel token ma ciò che in realtà significa che un token è valido dopo aver chiamato ValidateToken()? L'esistenza di un principio? Il token referenziato out contiene determinati valori? Non sono sicuro quando restituire true da questo metodo.Quando JWTSecurityTokenHandler.ValidateToken() è effettivamente valido?

public bool ValidateToken(string tokenString) 
{ 
    var validationParameters = new TokenValidationParameters() 
    { 
     ValidIssuer = "My Company", 
     ValidAudience = ApplicationId, 
     IssuerSigningKey = JsonWebTokenSecretKey 
    }; 

    SecurityToken token = new JwtSecurityToken(); 
    var tokenHandler = new JwtSecurityTokenHandler(); 
    var principal = tokenHandler.ValidateToken(tokenString, validationParameters, out token); 

    return principal != null; 
} 

risposta

11

Controllo tutti i valori delle attestazioni manualmente. Ho cercato una risposta definitiva alla tua stessa domanda, ma l'unica cosa che ho visto è che la funzione ValidateToken genera un'eccezione se qualcosa non va, quindi inizio avvolgendo la chiamata in un try-catch e restituisco false da la presa.

Questo è solo il mio "primo passaggio" per la convalida del token, però. Successivamente faccio un po 'più di sollevamento pesante per controllare manualmente determinati valori. Ad esempio, mi assicuro che il valore unique_name nella sezione delle attestazioni esista effettivamente come un utente nel mio database, che l'utente non sia stato disattivato e altri elementi del sistema proprietario del genere.

public static bool VerifyToken(string token) 
    { 
     var validationParameters = new TokenValidationParameters() 
     { 
      IssuerSigningToken = new BinarySecretSecurityToken(_key), 
      ValidAudience = _audience, 
      ValidIssuer = _issuer, 
      ValidateLifetime = true, 
      ValidateAudience = true, 
      ValidateIssuer = true, 
      ValidateIssuerSigningKey = true 
     }; 

     var tokenHandler = new JwtSecurityTokenHandler(); 
     SecurityToken validatedToken = null; 
     try 
     { 
      tokenHandler.ValidateToken(token, validationParameters, out validatedToken); 
     } 
     catch(SecurityTokenException) 
     { 
      return false; 
     } 
     catch(Exception e) 
     { 
      log(e.ToString()); //something else happened 
      throw; 
     } 
     //... manual validations return false if anything untoward is discovered 
     return validatedToken != null; 
    } 

L'ultima riga, return validatedToken != null, è puramente superstizione da parte mia. Non ho mai visto il validatedToken essere nullo.

+0

Benvenuti in Stack Overflow, Eddie. Si prega di notare che la sezione di risposta è solo per le risposte complete alla domanda originale, non per il commento. – Celeo

+6

Le mie scuse, ho pensato che stavo rispondendo alla domanda mostrando che hai impostato le proprietà di validazione su true e poi catturato le eccezioni generate. C'erano troppi commenti nella mia spiegazione? –

+3

Guardando il codice sorgente, sembra proprio questo il caso: ValidateToken getterà su un token non valido. https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/blob/master/src/System.IdentityModel.Tokens.Jwt/JwtSecurityTokenHandler.cs Questo è un cattivo design; non dovremmo usare le eccezioni per il controllo del flusso. Ma questo è lo stato di questa biblioteca oggi. –