2014-11-05 20 views
6

Sto provando a lavorare con i token bearer OAuth, ma non so come decrittografarli o ottenere i dati.Come decrittografare i token JWT Web API 2?

Quello che mi piacerebbe davvero fare è trovare o scrivere a me stesso uno strumento equivalente a questo strumento Google https://developers.google.com/wallet/digital/docs/jwtdecoder per i token che ottengo dall'API Web. Lo strumento Google ti consente di incollare la stringa di testo che rappresenta un token JWT e la divide e annulla la codifica del JSON.

In Visual Studio 2013 se si seleziona Nuovo progetto ASP.NET e quindi si sceglie il modello di API Web con account utente singoli, si ottiene un progetto di esempio che contiene un nodo finale del token. Se si avvia il progetto, è possibile inviare una richiesta "grant_type = Password & username = joe & password = joe" a/gettone sul costruita nel server web e si ottiene un gettone di nuovo:

{ 
"access_token":"x3vHm40WUXBiMZi_3EmdmCWLLuv4fsgjsg4S5Ya8kppDY_-2ejn7qF5Y_nbQ0bYVIKl6MNzL2GtXv-MAuwjippAAv5VDaxoKdxEVxeFrQ_eXsKNaQK7IvmVs1rIZ9eeRfRGK2AQ59wWQcyTtYO0dPJx9K7PGrSKz4ADAZ9SEZqQ4IesVhYbRCwToyxoyU5L9qdU8jXdHumkIrULRQhf68rIaBrEA_Be-V0rzWJ644fRLvv3z69XoHs3Az7PineILyNwbDck9uU2jkaXnwxoCTa4qlK8bR-lEI9-VXPNdbCvfgb5H9wfYsJcw2CMzNxNhV8v9YVZEt90evylwtTCEpXq4T3zRCQvrpbCvZrXqJ8uvlFeqCsvvhlIkSfPhBY8nm2ocWtBGPZm58zLe5FMi1jept0B54U38ZxkZlrGQKar47jkmnc6gpLrkpDBp7cWz", 
"token_type":"bearer", 
"expires_in":1209599, 
"userName":"joe", 
".issued":"Fri, 01 Aug 2014 16:16:02 GMT", 
".expires":"Fri, 15 Aug 2014 16:16:02 GMT" 
} 

quello che voglio per scoprirlo è il formato in cui si trova access_token e quali informazioni sono contenute.

Un indizio che ho trovato era: è possibile scegliere che tipo di token API Web utilizza impostando la proprietà OAuthAuthorizationServerOptions.AccessTokenFormat in Startup.Auth.cs. La documentazione per OAuthAuthorizationServerOptions dice:

"Il formato dei dati utilizzato per proteggere le informazioni contenute nel token di accesso. Se non fornito dall'applicazione, il provider di protezione dei dati predefinito dipende dal server host. La protezione dei dati delle chiavi della macchina .NET e HttpListener e altri server self-hosted useranno la protezione dei dati DPAPI Se viene assegnato un diverso fornitore o formato di token di accesso, è necessario assegnare un'istanza compatibile alla proprietà OAuthBearerAuthenticationOptions.AccessTokenProvider o OAuthBearerAuthenticationOptions.AccessTokenFormat del server delle risorse. "

Quindi è probabilmente codificato utilizzando MachineKey. Va bene, posso impostare il codice macchina OK, ma se conosco la chiave macchina con cui è stato creato il token, come posso decrittografarlo?

risposta

7

Sei corretto sulla generazione del token. Questo token è una stringa crittografata o firmata contenente la versione deserializzata di tutte le attestazioni e le proprietà del ticket per l'utente che ha eseguito l'accesso. Se in modalità IIS (SystemWeb), la crittografia e la firma vengono eseguite tramite i valori della chiave "decryptionKey" e "validationKey" nel nodo machineKey. Se è in esecuzione come applicazione OWIN self-host, la crittografia utilizza DPAPI per proteggerlo e utilizza effettivamente l'algoritmo 3DES.

per decodificarlo è necessario richiamare questo codice nel metodo di azione del controller API (non è necessario, ma se volete vedere cosa all'interno di questo token criptato):

string token = "Your token goes here"; 
Microsoft.Owin.Security.AuthenticationTicket ticket= Startup.OAuthBearerOptions.AccessTokenFormat.Unprotect(token); 

Se è necessario configurare il server AuthZ emettere token firmati JWT in modo da poterli decifrare utilizzando uno strumento di linea come il decodificatore JWT di Google; quindi ti consiglio di leggere il mio post sul blog qui su JSON Web Token in ASP.NET Web API 2 using Owin

+0

Questo è quasi quello che voglio, e mi ha aiutato a risolvere ciò su cui stavo lavorando. Quello che volevo veramente è un modo di decifrare il token senza dover essere in un sito Web ASP (quindi Startup.OAuthBearerOptions non è disponibile). Grazie per il tuo blog, ho letto parecchi articoli e sono stati molto utili. – Skippy

+0

'OAuthAuthorizationServerOptions.AccessTokenFormat' sembra utilizzare il metodo' Protect' per codificare e crittografare i token, ma il Framework non sembra utilizzare il metodo 'Unprotect' quando tenta di" scartare "il token. C'è qualche hook non documentato in AuthenticationServer da implementare o contrassegnare per [email protected], hai qualche idea in questo? –

+0

Taiseer, hai ottimi post su questo argomento. Ma puoi solo mostrare come firmare JWT per proteggerlo da manomissioni, puoi anche guidare come JWT crittografato seguendo le specifiche JSON Web Encryption (JWE) in ASP.Net MVC 5? –