2013-02-28 69 views
6

我正在嘗試編寫一個移動應用程序,它將從基於Webapi的休息站點獲取數據。與JWT的安全WebAPI

該網站應通過ACS進行保護(因爲可能有多個身份提供商)。

我的手機應用程序當前正在查詢以下網址https://xx.accesscontrol.windows.net/v2/metadata/IdentityProviders.js?protocol=javascriptnotify&realm=http://xx.azurewebsites.net/&version=1.0以獲取IP列表。

然後,我允許用戶選擇一個IP,然後使用網絡瀏覽器控件向他們顯示登錄信息。

一旦用戶登錄,我捕獲響應並提取令牌,但現在我不確定我應該做什麼。令牌是這樣的: -

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

所以,我猜我應該採取securityToken部分,並將其添加有Authorization頭的GET請求的一部分?

問題1是我應該如何附加令牌 - 我是否只附加安全令牌位,還是必須對base 64進行編碼並再次將其作爲Authorization頭附加?

問題2如何配置webapi來處理智威湯遜?之後,我已經修改了ACS發出JWT令牌,我安裝了JWTSecurityTokenHandler我仍然得到以下錯誤(這是被動認證):

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. 

感謝

羅斯

回答

8

雖然你不是活得t使用Azure身份驗證庫this AAL code sample is helpful顯示如何使用新的JWT Token Handler在請求管道中使用HTTP消息處理程序驗證對Web API的請求。代碼顯式處理ACS發佈的JWT。請特別注意Global.asax.cs中的TokenValidationHandler班。流程如下所示:

  1. 來自客戶端應用程序的傳入請求通過消息處理程序進行檢查。
  2. 使用JWTTokenHandler檢查和驗證授權標頭。
  3. 如果JWT令牌有效,那麼JWTTokenHandler將實例化一個新的ClaimsPrincipal對象。如果令牌無效,則返回HTTP 401 Unauthorized響應。

回到你的第一個問題,你只需要"securityToken"值(類似eyJ0eXAiOiJK...)作出授權頭像Authorization: Bearer eyJ0eXAiOiJK...。當這個請求傳遞給您的Web API時,JWTTokenHandler將通過Message Handler來驗證它。當然,這假設您的Web API已經正確配置,以便知道您首先從ACS獲取令牌的ACS租戶和安全域。

編輯:看一下模式&有關保護REST服務並從移動應用程序訪問它們的實踐指南 - 非常類似的情況,可能有助於爲您提供更多的上下文。