8

Ich versuche eine Token-Validierungsmethode zu erstellen, die true zurückgibt, wenn ein JWT-Token basierend auf der Signatur gültig ist. Ich glaube nicht, dass ich wirklich alles im Token validieren muss, aber was eigentlich ein Token bedeutet, ist nach dem Aufruf von ValidateToken() gültig? Die Existenz eines Prinzips? Das Out-referenzierte Token enthält bestimmte Werte? Nicht sicher, wann von dieser Methode die Wahrheit zurückgegeben werden soll.Wann ist JWTSecurityTokenHandler.ValidateToken() tatsächlich gültig?

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

Antwort

11

Ich überprüfe alle Schadenswerte manuell. Ich habe nach einer definitiven Antwort auf Ihre gleiche Frage gesucht, aber das einzige, was ich gesehen habe, ist, dass die ValidateToken-Funktion eine Exception auslöst, wenn etwas falsch ist, also fange ich an, den Call in einen try-catch zu verpacken und false von zurückzugeben der Fang.

Das ist aber nur mein "First-Pass" bei der Validierung des Token. Danach mache ich ein wenig schwereres Heben, um bestimmte Werte manuell zu überprüfen. Zum Beispiel stelle ich sicher, dass der Wert unique_name im Abschnitt claims tatsächlich als ein Benutzer in meiner Datenbank existiert, dass der Benutzer nicht deaktiviert wurde und andere proprietäre System-Sachen wie diese.

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

Die letzte Zeile, return validatedToken != null, ist rein Aberglaube meinerseits. Ich habe noch nie gesehen, dass der validierte Token null ist.

+0

Willkommen bei Stack Overflow, Eddie. Bitte beachten Sie, dass der Antwortbereich nur für vollständige Antworten auf die ursprüngliche Frage und nicht für Kommentare dient. – Celeo

+6

Entschuldigung, ich dachte, ich habe die Frage beantwortet, indem ich gezeigt habe, dass Sie die validate-Eigenschaften auf "true" setzen und dann Ausnahmen abfangen, die ausgelöst werden. Gab es zu viele Kommentare in meiner Erklärung? –

+3

Mit Blick auf den Quellcode scheint dies tatsächlich der Fall zu sein: ValidateToken wird auf ungültiges Token werfen. https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/blob/master/src/System.IdentityModel.Tokens.Jwt/JwtSecurityTokenHandler.cs Dies ist ein schlechtes Design; Wir sollten keine Ausnahmen für den Kontrollfluss verwenden. Aber das ist der Zustand dieser Bibliothek heute. –