2016-11-14 184 views
0

我正在運行web-app-samples-for-adal4j,我能夠看到/ secure/aad頁面,並且能夠恢復由Azure AD發送的idToken 。如何驗證idToken有效

但是,我的想法是將該令牌傳遞給不同的服務和它們,它們中的每一個都可以驗證該令牌是否有效。

因此,總結一下,我希望能夠從服務中檢查,所給的idtoken是有效的。據我瞭解,您必須驗證您可以從令牌中恢復的JWT是否使用證書籤名。我錯了嗎?

我正在使用本網站http://jwt.calebb.net/來檢查我是否可以解碼智威湯遜。在最後一部分我可以看到簽名。

所以,我的問題是,外部服務如何驗證令牌是由某個證書編碼的?並且,該證書在哪裏(是在FEDERATION METADATA文檔中)?

回答

1

基於我的理解,id_token用於客戶端驗證當前用戶信息。要檢查資源的特定權限,我們通常使用access_token。

爲了驗證從天青AD發出id_token其中使用ID連接協議與天青整合,我們可以按照以下的步驟(請參考OpenId specification):

  1. 如果ID令牌進行加密,使用所述密鑰解密以及客戶端在註冊期間指定OP將用於加密ID令牌的算法。如果加密在註冊時與OP協商並且ID令牌未加密,則RP應拒絕它。
  2. OpenID提供商的髮卡行標識符(通常在發現過程中獲得)必須與iss(發行者)聲明的值完全匹配。
  3. 客戶必須確認aud(聽衆)聲明包含其作爲受衆在iss(發行人)聲明所確定的發行人處註冊的client_id值。 aud(受衆)Claim可以包含具有多個元素的數組。如果ID令牌未將客戶列爲有效受衆,或者其中包含客戶不信任的其他受衆,則必須拒絕該ID令牌。
  4. 如果ID令牌包含多個受衆,則客戶端應該確認存在一個azp聲明。
  5. 如果azp(授權方)聲明存在,客戶端應該確認其client_id是聲明值。
  6. 如果通過客戶端和令牌端點(它在此流程中)之間的直接通信接收到了令牌令牌,則可以使用TLS服務器驗證來驗證發行者,而不是檢查令牌簽名。客戶端必須根據JWS [JWS]使用JWT alg Header Parameter中指定的算法驗證所有其他ID令牌的簽名。客戶必須使用發行人提供的密鑰。
  7. 在註冊期間,alg值應該是RS256的默認值或客戶端在id_token_signed_response_alg參數中發送的算法。
  8. 如果JWT alg頭參數使用基於MAC的算法,如HS256,HS384或HS512,則與aud(受衆)Claim中包含的client_id對應的client_secret的UTF-8表示的八位位組用作密鑰來驗證簽名。對於基於MAC的算法,如果aud是多值的,或者存在與aud值不同的azp值,則行爲未指定。
  9. 當前時間必須在exp claim表示的時間之前。
  10. iat聲明可用於拒絕發佈距離當前時間太遠的令牌,限制需要存儲nonces以防止攻擊的時間量。可接受的範圍是客戶特定的。
  11. 如果在身份驗證請求中發送了臨時值,則必須存在臨時值聲明並檢查其值以驗證它是否與身份驗證請求中發送的值相同。客戶端應該檢查重放攻擊的現時值。檢測重放攻擊的確切方法是客戶端特定的。
  12. 如果請求了acr聲明,客戶端應該檢查聲明的聲明值是否合適。 acr聲明值的含義和處理超出了本規範的範圍。
  13. 如果請求auth_time聲明,通過對此聲明的特定請求或通過使用max_age參數,客戶端應檢查auth_time聲明值並請求重新驗證,如果它確定自上次結束以來已經過了很長時間-用戶認證。

而且你可以獲取必要的簽名密鑰數據通過使用位於根據您正在開發的端點ID連接的元數據文件來驗證簽名:

https://login.microsoftonline.com/common/.well-known/openid-configuration https://login.microsoftonline.com/common/v2.0/.well-known/openid-configuration