2013-02-28 11 views
6

Ich versuche, eine mobile Anwendung zu schreiben, die Daten von einer webapi restbasierten Website erhält.Sicheres WebAPI mit einem JWT

Die Site sollte über ACS gesichert werden (da es mehrere Identity Provider geben kann).

Meine mobile App fragt derzeit die folgende URL https://xx.accesscontrol.windows.net/v2/metadata/IdentityProviders.js?protocol=javascriptnotify&realm=http://xx.azurewebsites.net/&version=1.0 ab, um eine Liste von IPs zu erhalten.

Ich erlaube dann dem Benutzer, eine IP zu wählen, und dann benutze ich eine Webbrowsersteuerung, die ich ihnen eine Anmeldung zeige.

Sobald der Benutzer angemeldet ist, erfassen ich die Antwort und extrahiere das Token, aber jetzt bin ich nicht wirklich sicher, was ich tun soll. Das Token sieht wie folgt aus: -

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

Also, ich vermute ich das Security teilnehmen sollte, und fügen Sie es ein Teil des Authorization-Header an die Erhaltungs-Anforderung hat?

Frage 1 ist, wie soll ich das Token anhängen - ich füge einfach das Sicherheits-Token-Bit an, oder muss ich Basis 64 das Los codieren und es erneut als Autorisierungsheader anhängen?

Frage 2 Wie konfiguriere ich das Webapi für die Handhabung eines JWT? Nachdem ich ACS geändert JWT Token ausgeben, und ich die JWTSecurityTokenHandler installierte ich noch die folgende Fehlermeldung erhalten (dies mit passiver Authentifizierung):

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. 

Dank

Ross

Antwort

8

Obwohl Sie aren‘ t Verwenden der Azure Authentication Library, this AAL code sample is helpful, um zu zeigen, wie mit der neuen JWT Token Handler Anforderungen an eine Web-API mithilfe eines HTTP-Nachrichtenhandlers in der Anforderungs-Pipeline authentifiziert werden können. Der Code behandelt explizit von ACS ausgegebene JWTs. Schauen Sie sich insbesondere die TokenValidationHandler Klasse in Global.asax.cs an. Der Ablauf verläuft wie folgt:

  1. Eingehende Anfrage von Client-App wird von Message-Handler überprüft.
  2. Der Autorisierungsheader wird mithilfe von JWTTokenHandler überprüft und validiert.
  3. Wenn das JWT-Token gültig ist, instanziiert JWTTokenHandler ein neues ClaimsPrincipal-Objekt. Wenn das Token nicht gültig ist, wird eine nicht autorisierte HTTP 401-Antwort zurückgegeben.

auf Ihre erste Frage zurückzukommen, müssen Sie nur den "securityToken" Wert (so etwas wie eyJ0eXAiOiJK...) eine Genehmigung Header wie Authorization: Bearer eyJ0eXAiOiJK... zu machen. Wenn dies in einer Anforderung an Ihre Web-API übergeben wird, validiert der JWTTokenHandler sie über den Nachrichtenhandler. Dies setzt natürlich voraus, dass Ihre Web-API ordnungsgemäß konfiguriert wurde, um auf die ACS-Mandant- und -Sicherheitsdomäne zu achten, die Sie zum Abrufen des Tokens von ACS an erster Stelle verwendet haben.

Bearbeiten: Werfen Sie einen Blick auf die Muster & Praktiken Anleitung zum Sichern von REST-Diensten und Zugriff von einer mobilen App - sehr ähnliches Szenario, das Ihnen helfen könnte, mehr Kontext zu geben.