Azure AD B2C を使用して Azure API Management API をセキュリティで保護する

Azure Active Directory B2C (Azure AD B2C) で認証されたクライアントのみが、ご利用の Azure API Management API にアクセスできるようにする方法について説明します。 この記事の手順に従うことで、Azure AD B2C で発行された有効なアクセス トークンを含む要求のみにアクセスを制限する受信ポリシーを Azure API Management で作成して、テストできます。

前提条件

作業を開始する前に、以下のリソースが準備されていることを確認してください。

Azure AD B2C アプリケーション ID を取得する

Azure API Management において Azure AD B2C を使用して API のセキュリティを保護する場合、Azure API Management で作成する受信ポリシーにいくつかの値が必要となります。 ご利用の Azure AD B2C テナントで以前に作成したアプリケーションのアプリ ID を記録します。 前提条件を満足するように作成したアプリケーションを使用する場合は、アプリケーション ID として "webbapp1" を使用します。

アプリケーションを Azure AD B2C テナントに登録するには、Microsoft の新しい統合されたアプリの登録エクスペリエンスか、以前のアプリケーション エクスペリエンスを使用できます。 新しい登録エクスペリエンスの詳細を参照してください。

  1. Azure portal にサインインします。
  2. 複数のテナントにアクセスできる場合、上部のメニューの [設定] アイコンを選び、[ディレクトリとサブスクリプション] メニューからお使いの Azure AD B2C テナントに切り替えます。
  3. 左側のペインで、 [Azure AD B2C] を選択します。 あるいは、 [すべてのサービス] を選択し、 [Azure AD B2C] を検索して選択します。
  4. [アプリの登録] を選択してから、 [所有しているアプリケーション] タブを選択します。
  5. webapp1 または以前に作成した別のアプリケーションの [アプリケーション (クライアント) ID] 列の値を記録します。

トークン発行者のエンドポイントを取得する

次に、ご利用の Azure AD B2C ユーザー フローのいずれかについて、既知の構成 URL を取得します。 また、Azure API Management でサポートするトークン発行者エンドポイント URI も必要です。

  1. Azure portal で、Azure AD B2C テナントに移動します。

  2. [ポリシー][ユーザー フロー] を選択します。

  3. 既存のポリシー (B2C_1_signupsignin1 など) を選択して、 [ユーザー フローを実行します] を選択します。

  4. ページの上部付近にある [ユーザー フローを実行します] 見出しの下に表示されるハイパーリンクの URL を記録します。 この URL は、ユーザー フロー用の OpenID Connect の既知の検出エンドポイントであり、次のセクションにおいて Azure API Management で受信ポリシーを構成するときに使用します。

    Screenshot of the well-known URI hyperlink on the

  5. ハイパーリンクを選択して、OpenID Connect の既知の構成ページに移動します。

  6. ブラウザーに表示されたページで、issuer の値を記録します。 次に例を示します。

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

    この値は、次のセクションにおいて、Azure API Management で API を構成するときに使用します。

次のセクションで使用する 2 つの URL (OpenID Connect の既知の構成エンドポイント 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 Management で受信ポリシーを構成する

これで、API 呼び出しを検証する受信ポリシーを Azure API Management に追加する準備ができました。 アクセス トークン内の対象ユーザーと発行者を検証する JSON Web トークン (JWT) 検証ポリシーを追加して、有効なトークンを使用した API 呼び出しのみを確実に受け入れるようにすることができます。

  1. Azure portal で、Azure API Management インスタンスに移動します。

  2. [API] を選択します。

  3. Azure AD B2C を使用してセキュリティ保護する API を選択します。

  4. [デザイン] タブを選択します。

  5. [受信処理] で、</> を選択してポリシー コード エディターを開きます。

  6. <inbound> ポリシー内に以下の <validate-jwt> タグを配置し、次の操作を行います。

    a. <openid-config> 要素内の url 値を、使用するポリシーの既知の構成 URL で更新します。
    b. <audience> 要素を、ご利用の B2C テナントで以前に作成したアプリケーションのアプリケーション ID で更新します (たとえば 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 Management 構成を検証できます。

API を呼び出すには、Azure AD B2C によって発行されたアクセス トークンと Azure API Management サブスクリプション キーの両方が必要です。

アクセス トークンを取得する

まず、Postman の Authorization ヘッダーで使用するために、Azure AD B2C によって発行されたトークンが必要です。 これを取得するには、前提条件の 1 つとして作成したサインアップ/サインイン ユーザー フローの [今すぐ実行] 機能を使用します。

  1. Azure portal で、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 Management サブスクリプション キーが、API に対する HTTP 要求に含まれる必要があります。 Postman HTTP 要求に含めるサブスクリプション キーを取得するには、次のことを行います。

  1. Azure portal で、ご利用の Azure API Management サービス インスタンスに移動します。
  2. [サブスクリプション] を選択します。
  3. [Product: Unlimited]\(製品: 無制限\) の横にある省略記号 ( ... ) を選択し、 [キーの表示/非表示] を選択します。
  4. 製品の [主キー] を記録します。 このキーは、Postman で、HTTP 要求の Ocp-Apim-Subscription-Key ヘッダーに使用します。

Screenshot of the

セキュリティで保護された API 呼び出しをテストする

アクセス トークンと Azure API Management サブスクリプション キーを記録したので、API に対するセキュリティで保護されたアクセスが正しく構成されているかどうかをテストする準備ができました。

  1. Postman で、新しい GET 要求を作成します。 [要求 URL] に、前提条件の 1 つとして発行した API のスピーカー リスト エンドポイントを指定します。 次に例を示します。

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

  2. さらに、次のヘッダーを追加します。

    Key
    Authorization 先ほど記録したエンコード済みトークン値。先頭に Bearer を付けます ("Bearer" の後にスペースを含めます)
    Ocp-Apim-Subscription-Key 先ほど記録した Azure API Management サブスクリプション キー。

    GET 要求 URL とヘッダーが下図のように表示されるはずです。

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

  3. Postman で [Send]\(送信\) ボタンを選択して、要求を実行します。 すべてを正しく構成した場合は、次に示すように、カンファレンス講演者のコレクションを含む 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 の呼び出しが想定どおりに拒否されることを確認します。 テストを実行する 1 つの方法として、トークン値にいくつかの文字を追加するか、変更してから、先ほどと同様に 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 Management API への要求だけが成功することが確認されました。

複数のアプリケーションと発行者をサポートする

通常は、複数のアプリケーションが 1 つの REST API でやりとりします。 複数のアプリケーションを対象とするトークンを API で受け取れるようにするには、Azure API Management 受信ポリシーの <audiences> 要素にアプリケーション ID を追加します。

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

同様に、複数のトークン発行者をサポートするには、Azure API Management 受信ポリシーの <issuers> 要素にエンドポイント URI を追加します。

<!-- 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 に移行する

レガシ login.microsoftonline.com エンドポイントによって発行されたトークンを検証する Azure API Management API がある場合は、API とそれを呼び出すアプリケーションを移行して、b2clogin.com によって発行されたトークンを使用するようにする必要があります。

次の一般的なプロセスに従うと、段階的な移行を実行できます。

  1. b2clogin.com と login.microsoftonline.com の両方によって発行されたトークンに対するサポートを、ご利用の Azure API Management 受信ポリシーに追加します。
  2. アプリケーションを 1 つずつ更新して、b2clogin.com エンドポイントからトークンを取得します。
  3. すべてのアプリケーションで b2clogin.com からのトークンが正常に取得されたら、login.microsoftonline.com によって発行されたトークンに対するサポートを API から削除します。

次の Azure API Management 受信ポリシーの例では、b2clogin.com と login.microsoftonline.com の両方によって発行されたトークンを受け入れる方法が示されています。 また、ポリシーでは 2 つのアプリケーションからの 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 Management ポリシーの詳細については、Azure API Management ポリシー リファレンスのインデックスに関するページを参照してください。

OWIN ベースの Web API とそのアプリケーションを b2clogin.com に移行する方法の詳細については、OWIN ベースの Web API を b2clogin.com に移行する方法に関するページを参照してください。