共用方式為


在 On-Behalf-Of 流程中使用委派使用者身分識別的服務對服務呼叫

警告

此內容適用於較舊的 Azure AD v1.0 端點。 針對新專案使用 Microsoft身分識別平臺

OAuth 2.0 On-Behalf-Of (OBO) 流程可讓叫用服務或 Web API 的應用程式將使用者驗證傳遞至另一個服務或 Web API。 OBO 流程會透過要求鏈結傳播委派的使用者身分識別和許可權。 若要讓仲介層服務向下游服務提出已驗證的要求,它必須代表用戶保護來自 Azure Active Directory (Azure AD) 的存取令牌。

這很重要

自 2018 年 5 月起, id_token 無法用於內部Behalf-Of 流程。 單頁應用程式 (SPA) 必須將存取令牌傳遞至仲介層機密用戶端,才能執行 OBO 流程。 如需可執行 On-Behalf-Of 呼叫之用戶端的詳細資訊,請參閱 限制

Behalf-Of 流程圖

OBO 流程會在使用 OAuth 2.0 授權碼授與流程的應用程式上驗證用戶之後開始。 此時,應用程式會將存取令牌 (令牌 A) 傳送至仲介層 Web API (API A),其中包含使用者的宣告並同意存取 API A。接下來,API A 會對下游 Web API (API B) 提出已驗證的要求。

這些步驟構成 On-Behalf-Of 流程: 顯示 OAuth2.0 On-Behalf-Of 流程中的步驟

  1. 用戶端應用程式會使用令牌 A 向 API A 提出要求。
  2. API A 會向 Azure AD 令牌發行端點進行驗證,並要求令牌來存取 API B。
  3. Azure AD 令牌發行端點會使用令牌 A 來驗證 API A 的認證,並發出 API B (令牌 B) 的存取令牌。
  4. 對 API B 的請求在授權標頭中包含令牌 B。
  5. API B 會從受保護的資源傳回數據。

備註

用於請求下游服務令牌的存取令牌中的受眾必須是發出 OBO 請求服務的識別碼。 令牌也必須使用 Azure Active Directory 的全域簽署密鑰進行簽署(這是預設用於透過入口網站中的 應用程式註冊 所註冊的應用程式)。

在 Azure AD 中註冊應用程式和服務

在 Azure AD 中註冊中介層服務和用戶端應用程式。

註冊中介層服務

  1. 登入 Azure 入口網站
  2. 在頂端工具列上,選取您的帳戶,然後在「目錄」列表底下尋找並選取您的應用程式的 Active Directory 租使用者。
  3. 選取左窗格中的 [更多服務 ],然後選擇 [Azure Active Directory]。
  4. 選取 [應用程式註冊 ],然後選取 [ 新增註冊]。
  5. 輸入應用程式的易記名稱,然後選取應用程式類型。
  6. 在 [支援的帳戶類型] 底下,選取 [任何組織目錄中的帳戶及個人的 Microsoft 帳戶]
  7. 將重新導向 URI 設定為基底 URL。
  8. 選取註冊以建立應用程式。
  9. 在 Azure 入口網站中,選擇您的應用程式,然後選取 [ 憑證與秘密]。
  10. 選取 [新增客戶端密碼 ],並新增持續時間為一年或兩年的秘密。
  11. 當您儲存此頁面時,Azure 入口網站會顯示秘密值。 將秘密值複製並儲存在安全的位置。
  12. 在您的應用程式的 公開 API 頁面上建立範圍,然後點擊「新增範圍」。 入口網站可能也需要您建立應用程式識別碼 URI。

這很重要

您需要秘密,才能在實作中設定應用程式設定。 此秘密值不會再次顯示,而且無法透過任何其他方式加以擷取。 一旦 Azure 入口網站中可見,就會立即加以記錄。

註冊客戶端應用程式

  1. 登入 Azure 入口網站
  2. 在頂端工具列上,選取您的帳戶,然後在「目錄」列表底下尋找並選取您的應用程式的 Active Directory 租使用者。
  3. 選取左窗格中的 [更多服務 ],然後選擇 [Azure Active Directory]。
  4. 選取 [應用程式註冊 ],然後選取 [ 新增註冊]。
  5. 輸入應用程式的易記名稱,然後選取應用程式類型。
  6. 在 [支援的帳戶類型] 底下,選取 [任何組織目錄中的帳戶及個人的 Microsoft 帳戶]
  7. 將重新導向 URI 設定為基底 URL。
  8. 選取註冊以建立應用程式。
  9. 設定應用程式的許可權。 在 [API 許可權] 中,選取 [新增許可權] ,然後選取 [我的 API]。
  10. 在文字欄位中輸入仲介層服務的名稱。
  11. 選擇 選取權限,然後選取您在註冊仲介層的最後一個步驟中建立的範圍。

設定已知的用戶端應用程式

在此案例中,中介層服務必須取得使用者的同意,才能存取下游 API,而不需要用戶互動。 授與下游 API 存取權的選項必須在驗證期間事先顯示為同意步驟的一部分。

請遵循下列步驟,在 Azure AD 中明確系結用戶端應用程式的註冊與仲介層服務的註冊。 這項作業會將客戶和中間層所需的同意合併成單一對話。

  1. 前往中介層服務註冊,然後選取 清單 以開啟清單編輯器。
  2. 找出陣列屬性,然後將客戶端應用程式的客戶端 ID 新增為該陣列的元素。
  3. 選取 [ 儲存] 以儲存指令清單。

服務間存取權杖請求

若要要求存取令牌,請使用下列參數對租使用者特定的 Azure AD 端點發出 HTTP POST:

https://login.microsoftonline.com/<tenant>/oauth2/token

用戶端應用程式會受到共享密碼或憑證保護。

第一個案例:具有共享密鑰的存取令牌請求

使用共享密碼時,服務對服務存取令牌要求包含下列參數:

參數 類型 說明
grant_type (授權類型) 必須的 令牌要求的型別。 OBO 要求會使用 JSON Web 令牌 (JWT),因此此值必須是 urn:ietf:params:oauth:grant-type:jwt-bearer
斷言 必須的 要求中使用的存取令牌值。
client_id (客戶識別碼) 必須的 在向 Azure AD 註冊期間指派給呼叫服務的應用程式識別碼。 若要在 Azure 入口網站中尋找應用程式識別碼,請選取 [Active Directory],選擇目錄,然後選取應用程式名稱。
用戶端密鑰 必須的 在 Azure AD 中為呼叫服務註冊的金鑰。 此值應該已在註冊時指出。
資源 必須的 接收服務的應用程式識別碼 URI(受保護的資源)。 若要在 Azure 入口網站中尋找應用程式識別碼 URI,請選取 [Active Directory ],然後選擇目錄。 選取應用程式名稱,選擇 [ 所有設定],然後選取 [ 屬性]。
請求的代幣使用 必須的 指定應該如何處理要求。 在 On-Behalf-Of 流程中,該值必須是 on_behalf_of
範圍 必須的 以空格分隔的令牌請求範圍列表。 針對OpenID Connect,必須指定範圍 openid

範例

下列 HTTP POST 要求取得 https://graph.microsoft.com web API 的存取權杖。 client_id 識別要求存取令牌的服務。

// line breaks for legibility only

POST /oauth2/token HTTP/1.1
Host: login.microsoftonline.com
Content-Type: application/x-www-form-urlencoded

grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Ajwt-bearer
&client_id=625391af-c675-43e5-8e44-edd3e30ceb15
&client_secret=0Y1W%2BY3yYb3d9N8vSjvm8WrGzVZaAaHbHHcGbcgG%2BoI%3D
&resource=https%3A%2F%2Fgraph.microsoft.com
&assertion=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6InowMzl6ZHNGdWl6cEJmQlZLMVRuMjVRSFlPMCIsImtpZCI6InowMzl6ZHNGdWl6cEJmQlZLMVRuMjVRSFlPMCJ9.ewogICJhdWQiOiAiaHR0cHM6Ly9ncmFwaC5taWNyb3NvZnQuY29tIiwKICAiaXNzIjogImh0dHBzOi8vc3RzLndpbmRvd3MubmV0LzI2MDM5Y2NlLTQ4OWQtNDAwMi04MjkzLTViMGM1MTM0ZWFjYi8iLAogICJpYXQiOiAxNDkzNDIzMTY4LAogICJuYmYiOiAxNDkzNDIzMTY4LAogICJleHAiOiAxNDkzNDY2OTUxLAogICJhY3IiOiAiMSIsCiAgImFpbyI6ICJBU1FBMi84REFBQUE1NnZGVmp0WlNjNWdBVWwrY1Z0VFpyM0VvV2NvZEoveWV1S2ZqcTZRdC9NPSIsCiAgImFtciI6IFsKICAgICJwd2QiCiAgXSwKICAiYXBwaWQiOiAiNjI1MzkxYWYtYzY3NS00M2U1LThlNDQtZWRkM2UzMGNlYjE1IiwKICAiYXBwaWRhY3IiOiAiMSIsCiAgImVfZXhwIjogMzAyNjgzLAogICJmYW1pbHlfbmFtZSI6ICJUZXN0IiwKICAiZ2l2ZW5fbmFtZSI6ICJOYXZ5YSIsCiAgImlwYWRkciI6ICIxNjcuMjIwLjEuMTc3IiwKICAibmFtZSI6ICJOYXZ5YSBUZXN0IiwKICAib2lkIjogIjFjZDRiY2FjLWI4MDgtNDIzYS05ZTJmLTgyN2ZiYjFiYjczOSIsCiAgInBsYXRmIjogIjMiLAogICJwdWlkIjogIjEwMDMzRkZGQTEyRUQ3RkUiLAogICJzY3AiOiAiVXNlci5SZWFkIiwKICAic3ViIjogIjNKTUlaSWJlYTc1R2hfWHdDN2ZzX0JDc3kxa1l1ekZKLTUyVm1Zd0JuM3ciLAogICJ0aWQiOiAiMjYwMzljY2UtNDg5ZC00MDAyLTgyOTMtNWIwYzUxMzRlYWNiIiwKICAidW5pcXVlX25hbWUiOiAibmF2eWFAZGRvYmFsaWFub3V0bG9vay5vbm1pY3Jvc29mdC5jb20iLAogICJ1cG4iOiAibmF2eWFAZGRvYmFsaWFub3V0bG9vay5vbm1pY3Jvc29mdC5jb20iLAogICJ1dGkiOiAieEN3ZnpoYS1QMFdKUU9MeENHZ0tBQSIsCiAgInZlciI6ICIxLjAiCn0.cqmUVjfVbqWsxJLUI1Z4FRx1mNQAHP-L0F4EMN09r8FY9bIKeO-0q1eTdP11Nkj_k4BmtaZsTcK_mUygdMqEp9AfyVyA1HYvokcgGCW_Z6DMlVGqlIU4ssEkL9abgl1REHElPhpwBFFBBenOk9iHddD1GddTn6vJbKC3qAaNM5VarjSPu50bVvCrqKNvFixTb5bbdnSz-Qr6n6ACiEimiI1aNOPR2DeKUyWBPaQcU5EAK0ef5IsVJC1yaYDlAcUYIILMDLCD9ebjsy0t9pj_7lvjzUSrbMdSCCdzCqez_MSNxrk1Nu9AecugkBYp3UVUZOIyythVrj6-sVvLZKUutQ
&requested_token_use=on_behalf_of
&scope=openid

第二個案例:使用憑證的存取令牌請求

含有憑證的服務對服務存取權杖要求會包含下列參數:

參數 類型 說明
grant_type (授權類型) 必須的 令牌要求的型別。 OBO 要求會使用 JWT 存取令牌,因此此值必須是 urn:ietf:params:oauth:grant-type:jwt-bearer
斷言 必須的 用於請求中的權杖的值。
client_id (客戶識別碼) 必須的 在向 Azure AD 註冊期間指派給呼叫服務的應用程式識別碼。 若要在 Azure 入口網站中尋找應用程式識別碼,請選取 [Active Directory],選擇目錄,然後選取應用程式名稱。
客戶聲明類型 必須的 值必須是 urn:ietf:params:oauth:client-assertion-type:jwt-bearer
client_assertion(客戶斷言) 必須的 您建立的 JSON Web 令牌,並使用您註冊的作為應用程式憑證的證書進行簽署。 請參閱 憑證認證 ,以瞭解判斷提示格式,以及如何註冊您的憑證。
資源 必須的 接收服務的應用程式識別碼 URI(受保護的資源)。 若要在 Azure 入口網站中尋找應用程式識別碼 URI,請選取 [Active Directory ],然後選擇目錄。 選取應用程式名稱,選擇 [ 所有設定],然後選取 [ 屬性]。
請求的代幣使用 必須的 指定應該如何處理要求。 在 On-Behalf-Of 流程中,該值必須是 on_behalf_of
範圍 必須的 以空格分隔的令牌請求範圍列表。 針對OpenID Connect,必須指定範圍 openid

這些參數與共享密碼的要求幾乎相同,不同之處在於 client_secret parameter ,會由兩個參數取代 : client_assertion_typeclient_assertion

範例

下列 HTTP POST 會使用憑證為 https://graph.microsoft.com Web API 要求存取令牌。 client_id 識別要求存取令牌的服務。

// line breaks for legibility only

POST /oauth2/token HTTP/1.1
Host: login.microsoftonline.com
Content-Type: application/x-www-form-urlencoded

grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Ajwt-bearer
&client_id=625391af-c675-43e5-8e44-edd3e30ceb15
&client_assertion_type=urn%3Aietf%3Aparams%3Aoauth%3Aclient-assertion-type%3Ajwt-bearer
&client_assertion=eyJhbGciOiJSUzI1NiIsIng1dCI6Imd4OHRHeXN5amNScUtqRlBuZDdSRnd2d1pJMCJ9.eyJ{a lot of characters here}M8U3bSUKKJDEg
&resource=https%3A%2F%2Fgraph.microsoft.com
&assertion=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6InowMzl6ZHNGdWl6cEJmQlZLMVRuMjVRSFlPMCIsImtpZCI6InowMzl6ZHNGdWl6cEJmQlZLMVRuMjVRSFlPMCJ9.eyJhdWQiOiJodHRwczovL2Rkb2JhbGlhbm91dGxvb2sub25taWNyb3NvZnQuY29tLzE5MjNmODYyLWU2ZGMtNDFhMy04MWRhLTgwMmJhZTAwYWY2ZCIsImlzcyI6Imh0dHBzOi8vc3RzLndpbmRvd3MubmV0LzI2MDM5Y2NlLTQ4OWQtNDAwMi04MjkzLTViMGM1MTM0ZWFjYi8iLCJpYXQiOjE0OTM0MjMxNTIsIm5iZiI6MTQ5MzQyMzE1MiwiZXhwIjoxNDkzNDY2NjUyLCJhY3IiOiIxIiwiYWlvIjoiWTJaZ1lCRFF2aTlVZEc0LzM0L3dpQndqbjhYeVp4YmR1TFhmVE1QeG8yYlN2elgreHBVQSIsImFtciI6WyJwd2QiXSwiYXBwaWQiOiJiMzE1MDA3OS03YmViLTQxN2YtYTA2YS0zZmRjNzhjMzI1NDUiLCJhcHBpZGFjciI6IjAiLCJlX2V4cCI6MzAyNDAwLCJmYW1pbHlfbmFtZSI6IlRlc3QiLCJnaXZlbl9uYW1lIjoiTmF2eWEiLCJpcGFkZHIiOiIxNjcuMjIwLjEuMTc3IiwibmFtZSI6Ik5hdnlhIFRlc3QiLCJvaWQiOiIxY2Q0YmNhYy1iODA4LTQyM2EtOWUyZi04MjdmYmIxYmI3MzkiLCJwbGF0ZiI6IjMiLCJzY3AiOiJ1c2VyX2ltcGVyc29uYXRpb24iLCJzdWIiOiJEVXpYbkdKMDJIUk0zRW5pbDFxdjZCakxTNUllQy0tQ2ZpbzRxS1MzNEc4IiwidGlkIjoiMjYwMzljY2UtNDg5ZC00MDAyLTgyOTMtNWIwYzUxMzRlYWNiIiwidW5pcXVlX25hbWUiOiJuYXZ5YUBkZG9iYWxpYW5vdXRsb29rLm9ubWljcm9zb2Z0LmNvbSIsInVwbiI6Im5hdnlhQGRkb2JhbGlhbm91dGxvb2sub25taWNyb3NvZnQuY29tIiwidmVyIjoiMS4wIn0.R-Ke-XO7lK0r5uLwxB8g5CrcPAwRln5SccJCfEjU6IUqpqcjWcDzeDdNOySiVPDU_ZU5knJmzRCF8fcjFtPsaA4R7vdIEbDuOur15FXSvE8FvVSjP_49OH6hBYqoSUAslN3FMfbO6Z8YfCIY4tSOB2I6ahQ_x4ZWFWglC3w5mK-_4iX81bqi95eV4RUKefUuHhQDXtWhrSgIEC0YiluMvA4TnaJdLq_tWXIc4_Tq_KfpkvI004ONKgU7EAMEr1wZ4aDcJV2yf22gQ1sCSig6EGSTmmzDuEPsYiyd4NhidRZJP4HiiQh-hePBQsgcSgYGvz9wC6n57ufYKh2wm_Ti3Q
&requested_token_use=on_behalf_of
&scope=openid

服務對服務存取令牌回應

成功回應是 JSON OAuth 2.0 回應,具有下列參數:

參數 說明
令牌類型 表示令牌類型值。 Azure AD 支援的唯一類型是 Bearer。 如需持有人令牌的詳細資訊,請參閱 OAuth 2.0 授權架構:持有人令牌使用方式(RFC 6750)。
範圍 在令牌中授予的存取範圍。
有效期限 存取令牌的有效時間長度(以秒為單位)。
到期日 存取令牌到期的時間。 日期會以 1970-01-01T0:0:0Z UTC 到到期時間之前的秒數表示。 這個值用來判斷快取令牌的存留期。
資源 接收服務的應用程式識別碼 URI(受保護的資源)。
access_token(存取憑證) 要求的存取憑證。 呼叫服務可以使用此權杖來對接收服務進行身份驗證。
id_token(驗證令牌) 請求的ID令牌。 呼叫服務可以使用此令牌來驗證使用者的身分識別,並與用戶開始會話。
刷新令牌 所要求存取權杖的刷新權杖。 目前的存取權杖到期後,呼叫服務可以使用此權杖來要求另一個存取權杖。

成功的回應範例

下列範例顯示 https://graph.microsoft.com Web API 存取令牌要求的成功回應。

{
    "token_type":"Bearer",
    "scope":"User.Read",
    "expires_in":"43482",
    "ext_expires_in":"302683",
    "expires_on":"1493466951",
    "not_before":"1493423168",
    "resource":"https://graph.microsoft.com",
    "access_token":"eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6InowMzl6ZHNGdWl6cEJmQlZLMVRuMjVRSFlPMCIsImtpZCI6InowMzl6ZHNGdWl6cEJmQlZLMVRuMjVRSFlPMCJ9.eyJhdWQiOiJodHRwczovL2dyYXBoLndpbmRvd3MubmV0IiwiaXNzIjoiaHR0cHM6Ly9zdHMud2luZG93cy5uZXQvMjYwMzljY2UtNDg5ZC00MDAyLTgyOTMtNWIwYzUxMzRlYWNiLyIsImlhdCI6MTQ5MzQyMzE2OCwibmJmIjoxNDkzNDIzMTY4LCJleHAiOjE0OTM0NjY5NTEsImFjciI6IjEiLCJhaW8iOiJBU1FBMi84REFBQUE1NnZGVmp0WlNjNWdBVWwrY1Z0VFpyM0VvV2NvZEoveWV1S2ZqcTZRdC9NPSIsImFtciI6WyJwd2QiXSwiYXBwaWQiOiI2MjUzOTFhZi1jNjc1LTQzZTUtOGU0NC1lZGQzZTMwY2ViMTUiLCJhcHBpZGFjciI6IjEiLCJlX2V4cCI6MzAyNjgzLCJmYW1pbHlfbmFtZSI6IlRlc3QiLCJnaXZlbl9uYW1lIjoiTmF2eWEiLCJpcGFkZHIiOiIxNjcuMjIwLjEuMTc3IiwibmFtZSI6Ik5hdnlhIFRlc3QiLCJvaWQiOiIxY2Q0YmNhYy1iODA4LTQyM2EtOWUyZi04MjdmYmIxYmI3MzkiLCJwbGF0ZiI6IjMiLCJwdWlkIjoiMTAwMzNGRkZBMTJFRDdGRSIsInNjcCI6IlVzZXIuUmVhZCIsInN1YiI6IjNKTUlaSWJlYTc1R2hfWHdDN2ZzX0JDc3kxa1l1ekZKLTUyVm1Zd0JuM3ciLCJ0aWQiOiIyNjAzOWNjZS00ODlkLTQwMDItODI5My01YjBjNTEzNGVhY2IiLCJ1bmlxdWVfbmFtZSI6Im5hdnlhQGRkb2JhbGlhbm91dGxvb2sub25taWNyb3NvZnQuY29tIiwidXBuIjoibmF2eWFAZGRvYmFsaWFub3V0bG9vay5vbm1pY3Jvc29mdC5jb20iLCJ1dGkiOiJ4Q3dmemhhLVAwV0pRT0x4Q0dnS0FBIiwidmVyIjoiMS4wIn0.cqmUVjfVbqWsxJLUI1Z4FRx1mNQAHP-L0F4EMN09r8FY9bIKeO-0q1eTdP11Nkj_k4BmtaZsTcK_mUygdMqEp9AfyVyA1HYvokcgGCW_Z6DMlVGqlIU4ssEkL9abgl1REHElPhpwBFFBBenOk9iHddD1GddTn6vJbKC3qAaNM5VarjSPu50bVvCrqKNvFixTb5bbdnSz-Qr6n6ACiEimiI1aNOPR2DeKUyWBPaQcU5EAK0ef5IsVJC1yaYDlAcUYIILMDLCD9ebjsy0t9pj_7lvjzUSrbMdSCCdzCqez_MSNxrk1Nu9AecugkBYp3UVUZOIyythVrj6-sVvLZKUutQ",
    "refresh_token":"AQABAAAAAABnfiG-mA6NTae7CdWW7QfdjKGu9-t1scy_TDEmLi4eLQMjJGt_nAoVu6A4oSu1KsRiz8XyQIPKQxSGfbf2FoSK-hm2K8TYzbJuswYusQpJaHUQnSqEvdaCeFuqXHBv84wjFhuanzF9dQZB_Ng5za9xKlUENrNtlq9XuLNVKzxEyeUM7JyxzdY7JiEphWImwgOYf6II316d0Z6-H3oYsFezf4Xsjz-MOBYEov0P64UaB5nJMvDyApV-NWpgklLASfNoSPGb67Bc02aFRZrm4kLk-xTl6eKE6hSo0XU2z2t70stFJDxvNQobnvNHrAmBaHWPAcC3FGwFnBOojpZB2tzG1gLEbmdROVDp8kHEYAwnRK947Py12fJNKExUdN0njmXrKxNZ_fEM33LHW1Tf4kMX_GvNmbWHtBnIyG0w5emb-b54ef5AwV5_tGUeivTCCysgucEc-S7G8Cz0xNJ_BOiM_4bAv9iFmrm9STkltpz0-Tftg8WKmaJiC0xXj6uTf4ZkX79mJJIuuM7XP4ARIcLpkktyg2Iym9jcZqymRkGH2Rm9sxBwC4eeZXM7M5a7TJ-5CqOdfuE3sBPq40RdEWMFLcrAzFvP0VDR8NKHIrPR1AcUruat9DETmTNJukdlJN3O41nWdZOVoJM-uKN3uz2wQ2Ld1z0Mb9_6YfMox9KTJNzRzcL52r4V_y3kB6ekaOZ9wQ3HxGBQ4zFt-2U0mSszIAA",
    "id_token":"eyJ0eXAiOiJKV1QiLCJhbGciOiJub25lIn0.eyJhdWQiOiI2MjUzOTFhZi1jNjc1LTQzZTUtOGU0NC1lZGQzZTMwY2ViMTUiLCJpc3MiOiJodHRwczovL3N0cy53aW5kb3dzLm5ldC8yNjAzOWNjZS00ODlkLTQwMDItODI5My01YjBjNTEzNGVhY2IvIiwiaWF0IjoxNDkzNDIzMTY4LCJuYmYiOjE0OTM0MjMxNjgsImV4cCI6MTQ5MzQ2Njk1MSwiYW1yIjpbInB3ZCJdLCJmYW1pbHlfbmFtZSI6IlRlc3QiLCJnaXZlbl9uYW1lIjoiTmF2eWEiLCJpcGFkZHIiOiIxNjcuMjIwLjEuMTc3IiwibmFtZSI6Ik5hdnlhIFRlc3QiLCJvaWQiOiIxY2Q0YmNhYy1iODA4LTQyM2EtOWUyZi04MjdmYmIxYmI3MzkiLCJwbGF0ZiI6IjMiLCJzdWIiOiJEVXpYbkdKMDJIUk0zRW5pbDFxdjZCakxTNUllQy0tQ2ZpbzRxS1MzNEc4IiwidGlkIjoiMjYwMzljY2UtNDg5ZC00MDAyLTgyOTMtNWIwYzUxMzRlYWNiIiwidW5pcXVlX25hbWUiOiJuYXZ5YUBkZG9iYWxpYW5vdXRsb29rLm9ubWljcm9zb2Z0LmNvbSIsInVwbiI6Im5hdnlhQGRkb2JhbGlhbm91dGxvb2sub25taWNyb3NvZnQuY29tIiwidXRpIjoieEN3ZnpoYS1QMFdKUU9MeENHZ0tBQSIsInZlciI6IjEuMCJ9."
}

錯誤回應範例

當 Azure AD 令牌端點嘗試取得使用條件式存取原則設定的下游 API 存取令牌時,會傳回錯誤回應(例如多重要素驗證)。 仲介層服務應該將此錯誤呈現給用戶端應用程式,讓用戶端應用程式可以提供使用者互動來滿足條件式存取原則。

{
    "error":"interaction_required",
    "error_description":"AADSTS50079: Due to a configuration change made by your administrator, or because you moved to a new location, you must enroll in multi-factor authentication to access 'bf8d80f9-9098-4972-b203-500f535113b1'.\r\nTrace ID: b72a68c3-0926-4b8e-bc35-3150069c2800\r\nCorrelation ID: 73d656cf-54b1-4eb2-b429-26d8165a52d7\r\nTimestamp: 2017-05-01 22:43:20Z",
    "error_codes":[50079],
    "timestamp":"2017-05-01 22:43:20Z",
    "trace_id":"b72a68c3-0926-4b8e-bc35-3150069c2800",
    "correlation_id":"73d656cf-54b1-4eb2-b429-26d8165a52d7",
    "claims":"{\"access_token\":{\"polids\":{\"essential\":true,\"values\":[\"9ab03e19-ed42-4168-b6b7-7001fb3e933a\"]}}}"
}

使用存取令牌來存取受保護的資源

中介層服務可以使用取得的存取令牌,藉由在標頭中 Authorization 設定令牌,對下游Web API提出已驗證的要求。

範例

GET /me?api-version=2013-11-08 HTTP/1.1
Host: graph.microsoft.com
Authorization: Bearer eyJ0eXAiO ... 0X2tnSQLEANnSPHY0gKcgw

使用 OAuth2.0 OBO 流程取得的 SAML 斷言

某些 OAuth 型 Web 服務需要存取其他 Web 服務 API,以接受非互動式流程中的 SAML 判斷提示。 Azure Active Directory 可以提供 SAML 斷言,來回應使用 SAML 型 Web 服務作為目標資源的 On-Behalf-Of 流程。

備註

這是 OAuth 2.0 On-Behalf-Of 流程的非標準延伸模組,可讓 OAuth2 型應用程式存取取用 SAML 令牌的 Web 服務 API 端點。

小提示

當您從前端 Web 應用程式呼叫 SAML 保護的 Web 服務時,只需呼叫 API,並使用使用者現有的工作階段起始一般的互動式驗證流程。 當服務對服務呼叫需要 SAML 令牌以提供使用者內容時,只需要使用 OBO 流程。

使用 OBO 要求搭配共享密鑰取得 SAML 令牌

SAML 判斷提示的服務對服務要求包含下列參數:

參數 類型 說明
grant_type (授權類型) 必須的 令牌要求的型別。 對於使用 JWT 的要求,此值必須是 urn:ietf:params:oauth:grant-type:jwt-bearer
斷言 必須的 要求中使用的存取令牌值。
client_id (客戶識別碼) 必須的 在向 Azure AD 註冊期間指派給呼叫服務的應用程式識別碼。 若要在 Azure 入口網站中尋找應用程式識別碼,請選取 [Active Directory],選擇目錄,然後選取應用程式名稱。
用戶端密鑰 必須的 在 Azure AD 中為呼叫服務註冊的金鑰。 此值應該已在註冊時指出。
資源 必須的 接收服務的應用程式識別碼 URI(受保護的資源)。 這是將成為 SAML 令牌對象的資源。 若要在 Azure 入口網站中尋找應用程式識別碼 URI,請選取 [Active Directory ],然後選擇目錄。 選取應用程式名稱,選擇 [ 所有設定],然後選取 [ 屬性]。
請求的代幣使用 必須的 指定應該如何處理要求。 在 On-Behalf-Of 流程中,該值必須是 on_behalf_of
請求的憑證類型 必須的 指定要求的令牌類型。 值可以是 urn:ietf:params:oauth:token-type:saml2urn:ietf:params:oauth:token-type:saml1 ,視存取的資源需求而定。

回應包含以UTF8和Base64url編碼的SAML令牌。

  • 來自 OBO 呼叫的 SAML 陳述的 SubjectConfirmationData:如果目標應用程式需要 SubjectConfirmationData 中的收件者值,則該值必須是資源應用程式設定中的非萬用字元回應 URL。

  • SubjectConfirmationData 節點:節點不能包含 InResponseTo 屬性,因為它不屬於 SAML 回應的一部分。 接收 SAML 令牌的應用程式必須能夠接受沒有 InResponseTo 屬性的 SAML 判斷提示。

  • 同意:必須授與同意,才能接收 SAML 令牌,其中包含 OAuth 流程上的用戶數據。 如需許可權和取得系統管理員同意的資訊,請參閱 Azure Active Directory v1.0 端點中的許可權和同意

以 SAML 斷言進行回應

參數 說明
令牌類型 表示令牌類型值。 Azure AD 支援的唯一類型是 Bearer。 如需持有人令牌的詳細資訊,請參閱 OAuth 2.0 授權架構:持有人令牌使用方式(RFC 6750)。
範圍 在令牌中授予的存取範圍。
有效期限 存取令牌的有效時間長度(以秒為單位)。
到期日 存取令牌到期的時間。 日期會以 1970-01-01T0:0:0Z UTC 到到期時間之前的秒數表示。 這個值用來判斷快取令牌的存留期。
資源 接收服務的應用程式識別碼 URI(受保護的資源)。
access_token(存取憑證) 回傳 SAML 聲明的參數。
刷新令牌 刷新令牌。 呼叫端服務可以使用此令牌,在目前的 SAML 判斷提示到期后要求另一個存取令牌。
  • token_type:承載者
  • expires_in:3296
  • ext_expires_in: 0
  • 過期日期:1529627844
  • 資源: https://api.contoso.com
  • access_token:<SAML assertion>
  • issued_token_type:urn:ietf:params:oauth:token-type:saml2
  • refresh_token: <Refresh token>

用戶端限制

具有通配符回復 URL 的公用客戶端無法 id_token 用於 OBO 流程。 不過,即使公用用戶端已註冊了具通配符的重新導向 URI,機密用戶端仍然可以兌換透過隱式授權流程取得的 存取 令牌。

後續步驟

深入瞭解 OAuth 2.0 通訊協定,以及執行使用用戶端認證的服務對服務驗證的另一種方式: