Microsoft 身分識別平台內的存取權杖

存取令牌可讓用戶端安全地呼叫受保護的 Web API。 Web API 會使用存取令牌來執行驗證和授權。

根據 OAuth 規格,存取權杖是沒有固定格式的不透明字串。 某些識別提供者 (IDP) 會使用 GUID,而其他則使用加密的 Blob。 存取令牌的格式取決於接受令牌的 API 組態。

開發人員在 Microsoft 身分識別平台 上註冊的自定義 API 可以選擇兩種稱為 和 v2.0的 JSON Web 令牌 (JWT) v1.0 格式。 Microsoft 開發的 API,例如 Microsoft Graph 或 Azure 中的 API 具有其他專屬令牌格式。 無法驗證的這些專屬格式可能是加密的令牌、JWT 或特殊 JWT 格式。

令牌的內容僅適用於 API,這表示存取令牌必須視為不透明字串。 僅供驗證和偵錯之用,開發人員可以使用類似 jwt.ms 的網站來譯碼 JWT。 Microsoft API 收到的令牌不一定是可譯碼的 JWT。

客戶端應該使用隨存取令牌一起傳回的令牌響應數據,以取得其內部內容的詳細數據。 當用戶端要求存取令牌時,Microsoft 身分識別平台 也會傳回一些有關存取令牌的元數據,以供取用應用程式。 這項資訊包括存取令牌的到期時間和有效範圍。 此數據可讓應用程式進行存取令牌的智慧型手機快取,而不需要剖析存取令牌本身。

請參閱下列各節,以瞭解 API 如何驗證和使用存取令牌內的宣告。

注意

此頁面上的所有檔,但未指定的位置除外,僅適用於針對已註冊的 API 所簽發的令牌。 它不適用於針對 Microsoft 擁有的 API 發行的令牌,也無法使用這些令牌來驗證 Microsoft 身分識別平台 如何發行已註冊 API 的令牌。

令牌格式

Microsoft 身分識別平台 有兩個可用的存取令牌版本:v1.0 和 v2.0。 這些版本會決定令牌中的宣告,並確定 Web API 可以控制令牌的內容。

Web API 在註冊期間選取下列其中一個版本做為預設值:

  • 僅限 Microsoft Entra 應用程式的 v1.0。 下列範例顯示 v1.0 令牌(金鑰已變更,並移除個人資訊,這可防止令牌驗證):

    eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6Imk2bEdrM0ZaenhSY1ViMkMzbkVRN3N5SEpsWSIsImtpZCI6Imk2bEdrM0ZaenhSY1ViMkMzbkVRN3N5SEpsWSJ9.eyJhdWQiOiJlZjFkYTlkNC1mZjc3LTRjM2UtYTAwNS04NDBjM2Y4MzA3NDUiLCJpc3MiOiJodHRwczovL3N0cy53aW5kb3dzLm5ldC9mYTE1ZDY5Mi1lOWM3LTQ0NjAtYTc0My0yOWYyOTUyMjIyOS8iLCJpYXQiOjE1MzcyMzMxMDYsIm5iZiI6MTUzNzIzMzEwNiwiZXhwIjoxNTM3MjM3MDA2LCJhY3IiOiIxIiwiYWlvIjoiQVhRQWkvOElBQUFBRm0rRS9RVEcrZ0ZuVnhMaldkdzhLKzYxQUdyU091TU1GNmViYU1qN1hPM0libUQzZkdtck95RCtOdlp5R24yVmFUL2tES1h3NE1JaHJnR1ZxNkJuOHdMWG9UMUxrSVorRnpRVmtKUFBMUU9WNEtjWHFTbENWUERTL0RpQ0RnRTIyMlRJbU12V05hRU1hVU9Uc0lHdlRRPT0iLCJhbXIiOlsid2lhIl0sImFwcGlkIjoiNzVkYmU3N2YtMTBhMy00ZTU5LTg1ZmQtOGMxMjc1NDRmMTdjIiwiYXBwaWRhY3IiOiIwIiwiZW1haWwiOiJBYmVMaUBtaWNyb3NvZnQuY29tIiwiZmFtaWx5X25hbWUiOiJMaW5jb2xuIiwiZ2l2ZW5fbmFtZSI6IkFiZSAoTVNGVCkiLCJpZHAiOiJodHRwczovL3N0cy53aW5kb3dzLm5ldC83MmY5ODhiZi04NmYxLTQxYWYtOTFhYi0yZDdjZDAxMjIyNDcvIiwiaXBhZGRyIjoiMjIyLjIyMi4yMjIuMjIiLCJuYW1lIjoiYWJlbGkiLCJvaWQiOiIwMjIyM2I2Yi1hYTFkLTQyZDQtOWVjMC0xYjJiYjkxOTQ0MzgiLCJyaCI6IkkiLCJzY3AiOiJ1c2VyX2ltcGVyc29uYXRpb24iLCJzdWIiOiJsM19yb0lTUVUyMjJiVUxTOXlpMmswWHBxcE9pTXo1SDNaQUNvMUdlWEEiLCJ0aWQiOiJmYTE1ZDY5Mi1lOWM3LTQ0NjAtYTc0My0yOWYyOTU2ZmQ0MjkiLCJ1bmlxdWVfbmFtZSI6ImFiZWxpQG1pY3Jvc29mdC5jb20iLCJ1dGkiOiJGVnNHeFlYSTMwLVR1aWt1dVVvRkFBIiwidmVyIjoiMS4wIn0.D3H6pMUtQnoJAGq6AHd
    
  • v2.0 適用於支援取用者帳戶的應用程式。 下列範例顯示 v2.0 令牌(金鑰已變更,並移除個人資訊,這可防止令牌驗證):

    eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6Imk2bEdrM0ZaenhSY1ViMkMzbkVRN3N5SEpsWSJ9.eyJhdWQiOiI2ZTc0MTcyYi1iZTU2LTQ4NDMtOWZmNC1lNjZhMzliYjEyZTMiLCJpc3MiOiJodHRwczovL2xvZ2luLm1pY3Jvc29mdG9ubGluZS5jb20vNzJmOTg4YmYtODZmMS00MWFmLTkxYWItMmQ3Y2QwMTFkYjQ3L3YyLjAiLCJpYXQiOjE1MzcyMzEwNDgsIm5iZiI6MTUzNzIzMTA0OCwiZXhwIjoxNTM3MjM0OTQ4LCJhaW8iOiJBWFFBaS84SUFBQUF0QWFaTG8zQ2hNaWY2S09udHRSQjdlQnE0L0RjY1F6amNKR3hQWXkvQzNqRGFOR3hYZDZ3TklJVkdSZ2hOUm53SjFsT2NBbk5aY2p2a295ckZ4Q3R0djMzMTQwUmlvT0ZKNGJDQ0dWdW9DYWcxdU9UVDIyMjIyZ0h3TFBZUS91Zjc5UVgrMEtJaWpkcm1wNjlSY3R6bVE9PSIsImF6cCI6IjZlNzQxNzJiLWJlNTYtNDg0My05ZmY0LWU2NmEzOWJiMTJlMyIsImF6cGFjciI6IjAiLCJuYW1lIjoiQWJlIExpbmNvbG4iLCJvaWQiOiI2OTAyMjJiZS1mZjFhLTRkNTYtYWJkMS03ZTRmN2QzOGU0NzQiLCJwcmVmZXJyZWRfdXNlcm5hbWUiOiJhYmVsaUBtaWNyb3NvZnQuY29tIiwicmgiOiJJIiwic2NwIjoiYWNjZXNzX2FzX3VzZXIiLCJzdWIiOiJIS1pwZmFIeVdhZGVPb3VZbGl0anJJLUtmZlRtMjIyWDVyclYzeERxZktRIiwidGlkIjoiNzJmOTg4YmYtODZmMS00MWFmLTkxYWItMmQ3Y2QwMTFkYjQ3IiwidXRpIjoiZnFpQnFYTFBqMGVRYTgyUy1JWUZBQSIsInZlciI6IjIuMCJ9.pj4N-w_3Us9DrBLfpCt
    

藉由為應用程式指令清單中的設定提供適當的值accessTokenAcceptedVersion,來設定應用程式的版本。 null1 的值會產生 v1.0 令牌,以及 v2.0 令牌的結果值2

令牌擁有權

存取令牌要求牽涉到兩方:用戶端、要求令牌的用戶端,以及接受令牌的資源 (Web API)。 令牌用於其對象的資源定義於令牌中的aud宣告中。 用戶端會使用令牌,但不應該了解或嘗試剖析令牌。 資源接受令牌。

Microsoft 身分識別平台 支援從任何版本端點發行任何令牌版本。 例如,當的值 accessTokenAcceptedVersion2時,呼叫 v1.0 端點的用戶端取得該資源的令牌會收到 v2.0 存取令牌。

資源一律會使用 宣告擁有其令牌, aud 而且是唯一可以變更其令牌詳細數據的應用程式。

權杖存留期

存取令牌的預設存留期是可變的。 發出時,Microsoft 身分識別平台 會將介於 60-90 分鐘(平均 75 分鐘)之間的隨機值指派為存取令牌的預設存留期。 此變化可藉由將存取令牌需求分散一段時間來改善服務復原能力,以防止每小時尖峰傳送至 Microsoft Entra ID 的流量。

不使用條件式存取的租用戶,對於 Microsoft Teams 和 Microsoft 365 等客戶端,預設存取令牌存留期為兩小時。

調整存取令牌的存留期,以控制用戶端應用程式過期應用程式會話的頻率,以及要求使用者以無訊息或互動方式重新驗證的頻率。 若要覆寫預設存取令牌存留期變化,請使用可設定的令牌存留期 (CTL)。

將預設令牌存留期變化套用至已啟用持續存取評估 (CAE) 的組織。 即使組織使用 CTL 原則,仍套用預設令牌存留期變化。 長期令牌存留期的預設令牌存留期範圍從 20 小時到 28 小時。 存取令牌到期時,客戶端必須使用重新整理令牌以無訊息方式取得新的重新整理令牌和存取令牌。

使用 條件式存取登入頻率 (SIF) 強制執行登入頻率的組織無法覆寫預設存取令牌存留期變化的頻率。 當組織使用 SIF 時,客戶端認證提示之間的時間是令牌存留期,範圍從 60 到 90 分鐘,加上登入頻率間隔。

以下是預設令牌存留期變化如何與登入頻率搭配運作的範例。 假設組織會設定每小時的登入頻率。 當令牌的存留期範圍從 60 到 90 分鐘不等時,實際的登入間隔會在 1 小時到 2.5 小時之間發生。

如果具有一小時存留期令牌的使用者在 59 分鐘執行互動式登入,則沒有認證提示,因為登入低於 SIF 閾值。 如果新令牌的存留期為 90 分鐘,使用者就不會看到認證提示,再出現一個半小時。 在無訊息更新嘗試期間,Microsoft Entra ID 需要認證提示,因為會話總長度已超過 1 小時的登入頻率設定。 在此範例中,由於SIF間隔和令牌存留期變化,認證提示之間的時間差異會是2.5小時。

驗證令牌

並非所有應用程式都應該驗證令牌。 只有在特定案例中,應用程式才應該驗證令牌:

  • Web API 必須驗證用戶端傳送給他們的存取令牌。 他們只能接受包含其中一個 AppId URI 作為宣告的 aud 令牌。
  • Web 應用程式必須在混合式流程中使用使用者的瀏覽器來驗證傳送給他們的標識元令牌,才能允許存取使用者的數據或建立會話。

如果先前所述的案例都不適用,就不需要驗證令牌。 原生、桌面或單頁應用程式的公用用戶端無法受益於驗證標識元令牌,因為應用程式會直接與 SSL 保護確保標識元令牌有效的 IDP 通訊。 他們不應該驗證存取令牌,因為它們是讓 Web API 進行驗證,而不是用戶端。

API 和 Web 應用程式只能驗證具有 aud 符合應用程式的宣告的權杖。 其他資源可能具有自定義令牌驗證規則。 例如,由於 Microsoft Graph 的專屬格式,您無法根據這些規則來驗證令牌。 驗證和接受適用於另一個資源的令牌是混淆的副問題範例

如果應用程式需要驗證標識碼令牌或存取令牌,它應該先根據OpenID探索檔中的值來驗證令牌的簽章和簽發者。

Microsoft Entra 中間件具有用來驗證存取令牌的內建功能,請參閱 範例 以適當語言尋找其中一個。 還有數個第三方開放原始碼連結庫可供 JWT 驗證使用。 如需驗證連結庫和程式碼範例的詳細資訊,請參閱驗證連結 。 如果您的 Web 應用程式或 Web API 位於 ASP.NET 或 ASP.NET Core 上,請使用 Microsoft.Identity.Web,為您處理驗證。

v1.0 和 v2.0 令牌

  • 當您的 Web 應用程式/API 正在驗證 v1.0 令牌(ver宣告 =“1.0”),它必須從 v1.0 端點讀取 OpenID 連線 元數據檔,https://login.microsoftonline.com/{example-tenant-id}/.well-known/openid-configuration即使為 Web API 設定的授權單位是 v2.0 授權單位也一樣。
  • 當您的 Web 應用程式/API 正在驗證 v2.0 令牌(ver宣告 =“2.0”),它必須從 v2.0 端點讀取 OpenID 連線 元數據檔,https://login.microsoftonline.com/{example-tenant-id}/v2.0/.well-known/openid-configuration即使針對 Web API 設定的授權單位是 v1.0 授權單位也一樣。

下列範例假設您的應用程式正在驗證 v2.0 存取令牌(因此參考 OIDC 元數據檔和密鑰的 v2.0 版)。 如果您驗證 v1.0 令牌,只要移除 URL 中的 “/v2.0”。

驗證簽發者

OpenID 連線 Core 顯示「簽發者標識碼 [...]必須完全符合 iss (issuer) Claim 的值。對於使用租使用者特定元數據端點的應用程式(例如 https://login.microsoftonline.com/aaaabbbb-0000-cccc-1111-dddd2222eeee/v2.0/.well-known/openid-configurationhttps://login.microsoftonline.com/contoso.onmicrosoft.com/v2.0/.well-known/openid-configuration),這是所有必要專案。

Microsoft Entra ID 具有租用戶無關的檔版本,可在 https://login.microsoftonline.com/common/v2.0/.well-known/openid-configuration取得。 此端點會傳回簽發者值 https://login.microsoftonline.com/{tenantid}/v2.0。 應用程式可以使用此與租用戶無關的端點,以下列修改來驗證來自每個租使用者的令牌:

  1. 應用程式不應預期令牌中的簽發者宣告與元數據中的簽發者值完全相符,而是應該將簽發者元數據中的值取代 {tenantid} 為目前要求的目標 tenantid,然後檢查完全相符專案。

  2. 應用程式應該使用 issuer 從金鑰端點傳回的屬性來限制金鑰的範圍。

    • 具有類似 之 https://login.microsoftonline.com/{tenantid}/v2.0 簽發者值的密鑰可以與任何相符的令牌簽發者搭配使用。
    • 具有類似 簽發 https://login.microsoftonline.com/9188040d-6c67-4c5b-b112-36a304b66dad/v2.0 者值的索引鍵應該只搭配完全相符使用。

    Microsoft Entra 租使用者獨立金鑰端點 (https://login.microsoftonline.com/common/discovery/v2.0/keys) 會傳回如下的檔:

    {
      "keys":[
        {"kty":"RSA","use":"sig","kid":"jS1Xo1OWDj_52vbwGNgvQO2VzMc","x5t":"jS1Xo1OWDj_52vbwGNgvQO2VzMc","n":"spv...","e":"AQAB","x5c":["MIID..."],"issuer":"https://login.microsoftonline.com/{tenantid}/v2.0"},
        {"kty":"RSA","use":"sig","kid":"2ZQpJ3UpbjAYXYGaXEJl8lV0TOI","x5t":"2ZQpJ3UpbjAYXYGaXEJl8lV0TOI","n":"wEM...","e":"AQAB","x5c":["MIID..."],"issuer":"https://login.microsoftonline.com/{tenantid}/v2.0"},
        {"kty":"RSA","use":"sig","kid":"yreX2PsLi-qkbR8QDOmB_ySxp8Q","x5t":"yreX2PsLi-qkbR8QDOmB_ySxp8Q","n":"rv0...","e":"AQAB","x5c":["MIID..."],"issuer":"https://login.microsoftonline.com/9188040d-6c67-4c5b-b112-36a304b66dad/v2.0"}
      ]
    }
    
  3. 使用 Microsoft Entra tenantid (tid) 宣告做為信任界限而不是標準簽發者宣告的應用程式,應該確保租使用者標識碼宣告是 guid,且簽發者和 tenantid 相符。

對於接受許多租使用者令牌的應用程式而言,使用租用戶無關的元數據會更有效率。

注意

使用 Microsoft Entra 租使用者無關的元數據時,宣告應該在租用戶內解譯,就像標準 OpenID 連線 一樣,宣告會在簽發者內解譯。 也就是說, {"sub":"ABC123","iss":"https://login.microsoftonline.com/aaaabbbb-0000-cccc-1111-dddd2222eeee/v2.0","tid":"aaaabbbb-0000-cccc-1111-dddd2222eeee"}{"sub":"ABC123","iss":"https://login.microsoftonline.com/bbbbcccc-1111-dddd-2222-eeee3333ffff/v2.0","tid":"bbbbcccc-1111-dddd-2222-eeee3333ffff"} 描述不同的使用者,即使 sub 相同,因為類似 sub 的宣告會在簽發者/租用戶的內容中解譯。

驗證簽章

JWT 包含三個以字元分隔的 . 區段。 第一個區段是 標頭,第二個是 主體,第三個是 簽章。 使用簽章區段來評估令牌的真實性。

Microsoft Entra ID 會發行使用業界標準非對稱加密演演算法簽署的令牌,例如 RS256。 JWT 的標頭包含用來簽署令牌之金鑰和加密方法的相關信息:

{
  "typ": "JWT",
  "alg": "RS256",
  "x5t": "iBjL1Rcqzhiy4fpxIxdZqohM2Yk",
  "kid": "iBjL1Rcqzhiy4fpxIxdZqohM2Yk"
}

宣告 alg 表示用來簽署令牌的演算法,而 kid 宣告則表示用來驗證令牌的特定公鑰。

在任何指定的時間點,Microsoft Entra ID 可能會使用一組特定公開-私鑰組的任何一組來簽署標識符令牌。 Microsoft Entra ID 會定期輪替一組可能的密鑰,因此撰寫應用程式以自動處理這些密鑰變更。 檢查 Microsoft Entra ID 所使用公鑰更新的合理頻率是每隔 24 小時。

使用位於下列位置的 OpenID 連線 元數據檔,取得驗證簽章所需的簽署金鑰數據:

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

提示

在瀏覽器中 試試看:URL

下列資訊描述中繼資料檔:

  • 這是 JSON 物件,其中包含數個有用的資訊片段,例如執行 OpenID 連線 驗證所需的各種端點位置。
  • jwks_uri包含 ,提供對應至用來簽署令牌之私鑰的公鑰集合位置。 位於的 jwks_uri JSON Web 金鑰 (JWK) 包含在該特定時間點使用的所有公鑰資訊。 RFC 7517 描述 JWK 格式。 應用程式可以使用 kid JWT 標頭中的宣告來選取公鑰,此檔案中會對應至已用來簽署特定令牌的私鑰。 然後,它可以使用正確的公鑰和指示的演算法來執行簽章驗證。

注意

kid使用 宣告來驗證令牌。 雖然 v1.0 令牌同時 x5t 包含 和 kid 宣告,但 v2.0 令牌只 kid 包含宣告。

執行簽章驗證超出本檔的範圍。 如有需要,有許多開放原始碼連結庫可用來協助進行簽章驗證。 不過,Microsoft 身分識別平台 有一個令牌簽署延伸模組,其為自定義簽署密鑰。

如果應用程式因使用 宣告對應 功能而具有自定義簽署金鑰,請附加 appid 包含應用程式識別碼的查詢參數。 若要進行驗證,請使用 jwks_uri 指向應用程式的簽署金鑰資訊。 例如: https://login.microsoftonline.com/{tenant}/.well-known/openid-configuration?appid=00001111-aaaa-2222-bbbb-3333cccc4444 包含 jwks_urihttps://login.microsoftonline.com/{tenant}/discovery/keys?appid=00001111-aaaa-2222-bbbb-3333cccc4444

驗證簽發者

驗證標識元令牌的 Web 應用程式,以及驗證存取令牌的 Web API,必須針對下列項目驗證令牌的簽發者:iss

  1. OpenID 中提供的簽發者會連線與應用程式組態 (authority) 相關聯的元數據檔。 要驗證的元資料檔取決於:
    • 令牌的版本
    • 您的應用程式所支援的帳戶。
  2. 權杖的租使用者識別碼 (tid 宣告)
  3. 簽署金鑰的簽發者。

單一租用戶應用程式

OpenID 連線 Core 表示「簽發者標識碼 [...]必須完全符合 (issuer) Claim 的值iss。對於使用租使用者特定元資料端點的應用程式,例如 https://login.microsoftonline.com/{example-tenant-id}/v2.0/.well-known/openid-configurationhttps://login.microsoftonline.com/contoso.onmicrosoft.com/v2.0/.well-known/openid-configuration

單一租使用者應用程式是支援下列專案的應用程式:

  • 一個組織目錄中的帳戶(僅限 example-tenant-id ): https://login.microsoftonline.com/{example-tenant-id}
  • 僅限個人 Microsoft 帳戶: https://login.microsoftonline.com/consumers取用者 是租使用者 9188040d-6c67-4c5b-b112-36a304b66dad 的昵稱)

多租用戶應用程式

Microsoft Entra ID 也支援多租用戶應用程式。 這些應用程式支援:

  • 任何組織目錄中的帳戶(任何 Microsoft Entra 目錄): https://login.microsoftonline.com/organizations
  • 任何組織目錄中的帳戶(任何 Microsoft Entra 目錄)和個人 Microsoft 帳戶(例如 Skype、XBox): https://login.microsoftonline.com/common

針對這些應用程式,Microsoft Entra ID 會分別在 https://login.microsoftonline.com/common/v2.0/.well-known/openid-configurationhttps://login.microsoftonline.com/organizations/v2.0/.well-known/openid-configuration 上公開與 租用戶無關的 OIDC 檔版本。 這些端點會傳回簽發者值,這是由 tenantid參數化的範本: https://login.microsoftonline.com/{tenantid}/v2.0。 應用程式可以使用這些與租用戶無關的端點,以下列規定驗證來自每個租使用者的令牌:

  • 驗證簽署金鑰簽發者
  • 應用程式不應預期令牌中的簽發者宣告與元數據中的簽發者值完全相符,而是應將簽發者元數據中的值取代 {tenantid} 為目前要求目標的租使用者標識碼,然後檢查完全相符專案(tid 令牌的宣告)。
  • tid驗證宣告是否為 GUID,而iss宣告的格式為https://login.microsoftonline.com/{tid}/v2.0{tid}確切tid宣告。 此驗證會將租用戶系結回簽發者,並回到建立信任鏈結的簽署密鑰範圍。
  • 在找到與宣告主體相關聯的數據時,請使用 tid 宣告。 換句話說, tid 宣告必須是用來存取用戶數據的密鑰的一部分。

驗證簽署金鑰簽發者

使用 v2.0 租用戶獨立元數據的應用程式需要驗證簽署金鑰簽發者。

金鑰檔案和簽署金鑰簽發者

如前所述,從 OpenID 連線 檔中,您的應用程式會存取用來簽署令牌的密鑰。 它會存取 OpenId jwks_uri 屬性中公開的 URL,以取得對應的索引鍵檔 連線。

 "jwks_uri": "https://login.microsoftonline.com/{example-tenant-id}/discovery/v2.0/keys",

此值{example-tenant-id}可以由 GUID、功能變數名稱或一般組織取用者取代

keys Azure AD v2.0 所公開的檔會針對每個密鑰包含使用此簽署金鑰的簽發者。 例如,租用戶獨立的「一般」密鑰端點 https://login.microsoftonline.com/common/discovery/v2.0/keys 會傳回如下的檔:

{
  "keys":[
    {"kty":"RSA","use":"sig","kid":"jS1Xo1OWDj_52vbwGNgvQO2VzMc","x5t":"jS1Xo1OWDj_52vbwGNgvQO2VzMc","n":"spv...","e":"AQAB","x5c":["MIID..."],"issuer":"https://login.microsoftonline.com/{tenantid}/v2.0"},
    {"kty":"RSA","use":"sig","kid":"2ZQpJ3UpbjAYXYGaXEJl8lV0TOI","x5t":"2ZQpJ3UpbjAYXYGaXEJl8lV0TOI","n":"wEM...","e":"AQAB","x5c":["MIID..."],"issuer":"https://login.microsoftonline.com/{tenantid}/v2.0"},
    {"kty":"RSA","use":"sig","kid":"yreX2PsLi-qkbR8QDOmB_ySxp8Q","x5t":"yreX2PsLi-qkbR8QDOmB_ySxp8Q","n":"rv0...","e":"AQAB","x5c":["MIID..."],"issuer":"https://login.microsoftonline.com/9188040d-6c67-4c5b-b112-36a304b66dad/v2.0"}
  ]
}

簽署金鑰簽發者的驗證

應用程式應該使用 issuer 金鑰檔的 屬性,與用來簽署令牌的金鑰相關聯,以限制密鑰的範圍:

  • 具有類似 https://login.microsoftonline.com/9188040d-6c67-4c5b-b112-36a304b66dad/v2.0 GUID 之簽發者值的索引鍵,只有在令牌中的宣告完全符合值時 iss ,才應該使用。
  • 具有樣https://login.microsoftonline.com/{tenantid}/v2.0板化簽發者值的索引鍵,只有在令牌中的宣告在取代tid佔位符之令牌{tenantid}中的宣告之後,才應該使用iss這個值。

對於接受許多租使用者令牌的應用程式而言,使用租用戶無關的元數據會更有效率。

注意

使用與 Microsoft Entra 租使用者無關的元數據,宣告應該在租用戶內解譯,就像標準 OpenID 連線 一樣,宣告會在簽發者內解譯。 也就是說, {"sub":"ABC123","iss":"https://login.microsoftonline.com/{example-tenant-id}/v2.0","tid":"{example-tenant-id}"}{"sub":"ABC123","iss":"https://login.microsoftonline.com/{another-tenand-id}/v2.0","tid":"{another-tenant-id}"} 描述不同的使用者,即使 sub 相同,因為類似 sub 的宣告會在簽發者/租用戶的內容中解譯。

概括回顧

以下是一些虛擬程式代碼,可回顧如何驗證簽發者和簽署密鑰簽發者:

  1. 從已設定的元數據 URL 擷取金鑰
  2. 如果以其中一個已發佈的密鑰簽署,請檢查令牌,如果不是,則失敗
  3. 根據子標頭識別元數據中的索引鍵。 檢查附加至元資料檔案中金鑰的「簽發者」屬性:
    var issuer = metadata["kid"].issuer;
    if (issuer.contains("{tenantId}", CaseInvariant)) issuer = issuer.Replace("{tenantid}", token["tid"], CaseInvariant);
    if (issuer != token["iss"]) throw validationException;
    if (configuration.allowedIssuer != "*" && configuration.allowedIssuer != issuer) throw validationException;
    var issUri = new Uri(token["iss"]);
    if (issUri.Segments.Count < 1) throw validationException;
    if (issUri.Segments[1] != token["tid"]) throw validationException;
    

另請參閱

下一步