使用 Azure AD B2C 保護 Azure API 管理 API

瞭解如何將 Azure API 管理 API 的存取限制為已向 Azure Active Directory B2C (Azure AD B2C) 驗證的用戶端。 請遵循本文中的指示,在 Azure API 管理 中建立及測試輸入原則,以限制只存取包含有效 Azure AD B2C 發行存取令牌的要求。

必要條件

開始之前,請確定您已具備下列資源:

取得 Azure AD B2C 應用程式識別碼

當您使用 Azure AD B2C 保護 Azure API 管理 中的 API 時,您需要在 Azure API 管理 中建立的輸入原則數個值。 首先,記錄您先前在 Azure AD B2C 租使用者中建立的應用程式應用程式識別碼。 如果您使用您所建立的應用程式來滿足必要條件,請使用webapp1的應用程式識別碼

若要在 Azure AD B2C 租用戶中註冊應用程式,您可以使用我們新的整合 應用程式註冊 體驗或舊版應用程式體驗。 深入瞭解 新的註冊體驗

  1. 登入 Azure 入口網站
  2. 如果您有多個租使用者的存取權,請選取頂端功能表中的 [設定] 圖示,從 [目錄 + 訂用帳戶] 功能表切換至您的 Azure AD B2C 租使用者。
  3. 在左窗格中,選取 [Azure AD B2C]。 或者,您可以選取 [所有服務],然後搜尋並選取 [Azure AD B2C]。
  4. 選取 [應用程式註冊],然後選取 [擁有的應用程式] 索引標籤。
  5. 針對 webapp1 或您先前建立的另一個應用程式,記錄 [應用程式][用戶端] 識別碼數據行中的值。

取得令牌簽發者端點

接下來,取得其中一個 Azure AD B2C 使用者流程的已知組態 URL。 您也需要您想要在 Azure API 管理 中支援的權杖簽發者端點 URI。

  1. Azure 入口網站 中,移至您的 Azure AD B2C 租使用者。

  2. 在 [原則] 底下,選取 [使用者流程]。

  3. 選取現有的原則(例如 ,B2C_1_signupsignin1),然後選取 [ 執行使用者流程]。

  4. 將超連結中的 URL 記錄在頁面頂端附近的 [執行使用者流程] 標題底下。 此 URL 是使用者流程的 OpenID 連線 已知的探索端點,當您在 Azure API 管理 中設定輸入原則時,您將在下一節中使用它。

    Screenshot of the well-known URI hyperlink on the

  5. 選取超連結以移至 OpenID 連線 已知組態頁面。

  6. 在瀏覽器中開啟的頁面上,記錄 issuer 值。 例如:

    https://<tenant-name>.b2clogin.com/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/v2.0/

    當您在 Azure API 管理 中設定 API 時,您將在下一節中使用此值。

您現在應該會在下一節中記錄兩個URL:OpenID 連線 已知的組態端點 URL 和簽發者 URI。 例如:

https://<tenant-name>.b2clogin.com/<tenant-name>.onmicrosoft.com/B2C_1_signupsignin1/v2.0/.well-known/openid-configuration
https://<tenant-name>.b2clogin.com/99999999-0000-0000-0000-999999999999/v2.0/

在 Azure API 管理 中設定輸入原則

您現在已準備好在 Azure API 管理 中新增輸入原則,以驗證 API 呼叫。 藉由新增 JSON Web 令牌 (JWT) 驗證 原則來驗證存取權杖中的物件和簽發者,您可以確保只接受具有有效令牌的 API 呼叫。

  1. Azure 入口網站 中,移至您的 Azure API 管理 實例。

  2. 選取 [API]。

  3. 選取您想要使用 Azure AD B2C 保護的 API。

  4. 選取 [設計] 索引標籤。

  5. 在 [輸入處理] 底下,選取< />以開啟原則程式代碼編輯器。

  6. 將下列 <validate-jwt> 標籤放在原則內 <inbound> ,然後執行下列動作:

    a. 使用 url 您原則的已知組態 URL 更新 元素中的 <openid-config> 值。
    b. <audience>使用您先前在 B2C 租使用者中建立之應用程式的應用程式識別碼來更新 元素(例如 webapp1)。
    c. <issuer>使用您稍早記錄的令牌簽發者端點來更新 專案。

    <policies>
        <inbound>
            <validate-jwt header-name="Authorization" failed-validation-httpcode="401" failed-validation-error-message="Unauthorized. Access token is missing or invalid.">
                <openid-config url="https://<tenant-name>.b2clogin.com/<tenant-name>.onmicrosoft.com/B2C_1_signupsignin1/v2.0/.well-known/openid-configuration" />
                <audiences>
                    <audience>44444444-0000-0000-0000-444444444444</audience>
                </audiences>
                <issuers>
                    <issuer>https://<tenant-name>.b2clogin.com/99999999-0000-0000-0000-999999999999/v2.0/</issuer>
                </issuers>
            </validate-jwt>
            <base />
        </inbound>
        <backend> <base /> </backend>
        <outbound> <base /> </outbound>
        <on-error> <base /> </on-error>
    </policies>
    

驗證安全 API 存取

若要確保只有已驗證的呼叫端可以存取您的 API,您可以使用 Postman 呼叫 API 來驗證 Azure API 管理 設定。

若要呼叫 API,您需要 Azure AD B2C 和 Azure API 管理 訂用帳戶密鑰所簽發的存取令牌。

取得存取權杖

您必須先有 Azure AD B2C 所發出的令牌,才能在 Postman 的 Authorization 標頭中使用。 您可以使用您建立為其中一 個必要條件的註冊/登入使用者流程的 [立即執行 ] 功能來取得。

  1. Azure 入口網站 中,移至您的 Azure AD B2C 租使用者。

  2. 在 [原則] 底下,選取 [使用者流程]。

  3. 選取現有的註冊/登入使用者流程(例如, B2C_1_signupsignin1)。

  4. 針對 [ 應用程式],選取 [webapp1]。

  5. 針對 [回覆 URL],選取 https://jwt.ms

  6. 選取執行使用者流程

    Screenshot of the

  7. 完成登入程式。 您應該重新導向至 https://jwt.ms

  8. 記錄瀏覽器中顯示的編碼令牌值。 您將這個令牌值用於Postman中的 Authorization 標頭。

    Screenshot of the encoded token value displayed on jwt.ms.

取得 API 訂用帳戶金鑰

呼叫已發佈 API 的用戶端應用程式(在此案例中為 Postman)必須在對 API 的 HTTP 要求中包含有效的 API 管理 訂用帳戶密鑰。 若要取得訂用帳戶金鑰以包含在 Postman HTTP 要求中:

  1. Azure 入口網站 中,移至您的 Azure API 管理 服務實例。
  2. 選取 訂用帳戶
  3. 選取 [產品:無限制] 旁的省略號 (...),然後選取 [顯示/隱藏密鑰]。
  4. 記錄產品的主鍵。 您會在 Postman 的 HTTP 要求中使用此金鑰作為 Ocp-Apim-Subscription-Key 標頭。

Screenshot of the

測試安全的 API 呼叫

記錄存取令牌和 Azure API 管理 訂用帳戶密鑰後,您現在已準備好測試是否已正確設定 API 的安全存取。

  1. 在 Postman建立新的GET要求。 針對要求 URL,指定您發佈為其中一個必要條件之 API 的演講者清單端點。 例如:

    https://contosoapim.azure-api.net/conference/speakers

  2. 接下來,新增下列標頭:

    機碼
    Authorization 您稍早記錄的編碼令牌值,前面加上 Bearer (包含 “Bearer” 後面的空格)
    Ocp-Apim-Subscription-Key 您稍早記錄的 Azure API 管理 訂用帳戶金鑰。

    您的 GET 要求 URL 和 標頭 看起來應該類似下圖所示的 URL:

    Screenshot of the Postman UI showing the GET request URL and headers.

  3. 在 Postman 中 ,選取 [傳送 ] 按鈕以執行要求。 如果您已正確設定所有專案,則應該提供具有會議演講者集合的 JSON 回應(如下所示,截斷):

    {
      "collection": {
        "version": "1.0",
        "href": "https://conferenceapi.azurewebsites.net:443/speakers",
        "links": [],
        "items": [
          {
            "href": "https://conferenceapi.azurewebsites.net/speaker/1",
            "data": [
              {
                "name": "Name",
                "value": "Scott Guthrie"
              }
            ],
            "links": [
              {
                "rel": "http://tavis.net/rels/sessions",
                "href": "https://conferenceapi.azurewebsites.net/speaker/1/sessions"
              }
            ]
          },
    [...]
    

測試不安全的 API 呼叫

既然您已成功提出要求,請測試失敗案例,以確保以 無效 令牌呼叫您的 API 會如預期般遭到拒絕。 執行測試的其中一個方法是在令牌值中新增或變更幾個字元,然後執行與之前相同的 GET 要求。

  1. 將數個字元新增至令牌值,以模擬無效的令牌。 例如,您可以將 「INVALID」 新增至令牌值,如下所示:

    Screenshot of the Headers section of Postman UI showing the string INVALID added to token.

  2. 選取 [ 傳送 ] 按鈕以執行要求。 使用無效的令牌時,預期的結果是 401 未經授權的狀態代碼:

    {
        "statusCode": 401,
        "message": "Unauthorized. Access token is missing or invalid."
    }
    

如果您看到401狀態代碼,您已確認只有具有 Azure AD B2C 所發出有效存取令牌的呼叫端,才能對 Azure API 管理 API 提出成功的要求。

支援多個應用程式和簽發者

數個應用程式通常會與單一 REST API 互動。 若要讓您的 API 接受適用於多個應用程式的令牌,請將其應用程式識別碼新增至 <audiences> Azure API 管理 輸入原則中的 元素。

<!-- Accept tokens intended for these recipient applications -->
<audiences>
    <audience>44444444-0000-0000-0000-444444444444</audience>
    <audience>66666666-0000-0000-0000-666666666666</audience>
</audiences>

同樣地,若要支援多個令牌簽發者,請將端點 URI 新增至 <issuers> Azure API 管理 輸入原則中的 元素。

<!-- Accept tokens from multiple issuers -->
<issuers>
    <issuer>https://<tenant-name>.b2clogin.com/99999999-0000-0000-0000-999999999999/v2.0/</issuer>
    <issuer>https://login.microsoftonline.com/99999999-0000-0000-0000-999999999999/v2.0/</issuer>
</issuers>

遷移至 b2clogin.com

如果您有一個 Azure API 管理 M API 來驗證舊版login.microsoftonline.com端點所簽發的令牌,您應該移轉 API 和呼叫它的應用程式,以使用 b2clogin.com 所簽發的令牌。

您可以遵循此一般程式來執行分段移轉:

  1. 針對 b2clogin.com 和 login.microsoftonline.com 所簽發的令牌,在您的 Azure API 管理 輸入原則中新增支援。
  2. 一次更新您的應用程式,以從 b2clogin.com 端點取得令牌。
  3. 從 b2clogin.com 正確取得令牌之後,請從 API 移除 login.microsoftonline.com 發行令牌的支援。

下列範例 Azure API 管理 輸入原則說明如何接受 b2clogin.com 和 login.microsoftonline.com 所簽發的令牌。 此外,此原則支援來自兩個應用程式的 API 要求。

<policies>
    <inbound>
        <validate-jwt header-name="Authorization" failed-validation-httpcode="401" failed-validation-error-message="Unauthorized. Access token is missing or invalid.">
            <openid-config url="https://<tenant-name>.b2clogin.com/<tenant-name>.onmicrosoft.com/B2C_1_signupsignin1/v2.0/.well-known/openid-configuration" />
            <audiences>
                <audience>44444444-0000-0000-0000-444444444444</audience>
                <audience>66666666-0000-0000-0000-666666666666</audience>
            </audiences>
            <issuers>
                <issuer>https://login.microsoftonline.com/99999999-0000-0000-0000-999999999999/v2.0/</issuer>
                <issuer>https://<tenant-name>.b2clogin.com/99999999-0000-0000-0000-999999999999/v2.0/</issuer>
            </issuers>
        </validate-jwt>
        <base />
    </inbound>
    <backend> <base /> </backend>
    <outbound> <base /> </outbound>
    <on-error> <base /> </on-error>
</policies>

下一步

如需 Azure API 管理 原則的其他資訊,請參閱 Azure API 管理 原則參考索引

如需將 OWIN 型 Web API 及其應用程式移轉至 b2clogin.com 的相關信息,請參閱 將 OWIN 型 Web API 遷移至 b2clogin.com