2013-02-28 22 views
6

Sto provando a scrivere un'applicazione mobile che otterrà i dati da un sito Webapi basato sul resto.Secure WebAPI con JWT

Il sito deve essere protetto tramite ACS (poiché possono esistere più provider di identità).

La mia app mobile sta attualmente interrogando il seguente URL https://xx.accesscontrol.windows.net/v2/metadata/IdentityProviders.js?protocol=javascriptnotify&realm=http://xx.azurewebsites.net/&version=1.0 per ottenere un elenco di IP.

Quindi autorizzo l'utente a scegliere un IP, quindi utilizzando un controllo del browser Web visualizzo loro un accesso.

Una volta che l'utente ha effettuato l'accesso, acquisisco la risposta ed estrai il token, ma ora non sono proprio sicuro di cosa dovrei fare. Il token si presenta così: -

{"appliesTo":"http://****.azurewebsites.net/", 
"context":null, 
"created":1362069383, 
"expires":1362072983, 
"securityToken":"... a lot of text:-)", 
"tokenType":"urn:ietf:params:oauth:token-type:jwt"} 

Quindi, sto cercando di indovinare che dovrei prendere la parte SecurityToken e aggiungerlo ha parte dell'intestazione di autorizzazione alla richiesta get?

Domanda 1 è come devo allegare il token: devo semplicemente allegare il bit del token di sicurezza, oppure devo codificare in base 64 il lotto e collegarlo di nuovo come intestazione Autorizzazione?

Domanda 2 Come si configura webapi per gestire un JWT? Dopo che ho modificato ACS ad emettere i token JWT, e ho installato il JWTSecurityTokenHandler ho ancora ottenere il seguente errore (questo è con l'autenticazione passiva):

JWT10310: Unable to validate signature. validationParameters.SigningTokenResolver type: 'System.IdentityModel.Tokens.IssuerTokenResolver', was unable to resolve key to a token. 
The SecurityKeyIdentifier is: 
'SecurityKeyIdentifier 
    (
    IsReadOnly = False, 
    Count = 1, 
    Clause[0] = X509ThumbprintKeyIdentifierClause(Hash = 0x2FEE3EE96B019D4BA0C046124B77C652EEF768E5) 
    ) 
'. validationParameters.SigningToken was null. 

Grazie

Ross

risposta

8

Anche se si aren' t utilizzando la libreria di autenticazione di Azure, this AAL code sample is helpful, nel mostrare come utilizzare il nuovo JWT Token Handler per autenticare le richieste a un'API Web utilizzando un gestore di messaggi HTTP nella pipeline della richiesta. Il codice gestisce esplicitamente i JWT emessi da ACS. In particolare, guarda la classe TokenValidationHandler in Global.asax.cs. Il flusso va così:

  1. La richiesta in ingresso dall'app client viene controllata dal gestore messaggi.
  2. L'intestazione dell'autorizzazione viene esaminata e convalidata utilizzando JWTTokenHandler.
  3. Se il token JWT è valido, JWTTokenHandler crea un'istanza di un nuovo oggetto ClaimsPrincipal. Se il token non è valido, viene restituita una risposta non autorizzata HTTP 401.

Tornando alla tua prima domanda, basta il valore "securityToken" (qualcosa come eyJ0eXAiOiJK...) per rendere un'intestazione di autorizzazione come Authorization: Bearer eyJ0eXAiOiJK.... Quando questo viene passato in una richiesta all'API Web, JWTTokenHandler lo convaliderà tramite il Gestore messaggi. Ovviamente questo presuppone che la tua API Web sia stata configurata correttamente per essere al corrente del tenant e del dominio di sicurezza ACS che hai utilizzato per ottenere il token da ACS in primo luogo.

Modifica: Dai un'occhiata ai modelli & indicazioni pratiche per proteggere i servizi REST e accedervi da un'app mobile: uno scenario molto simile che potrebbe aiutarti a fornire più contesto.