トークン発行イベント用にカスタム クレーム プロバイダーを構成する

この記事では、トークン発行開始イベント用にカスタム クレーム プロバイダーを構成する方法について説明します。 既存の Azure 関数 REST API を使用して、カスタム認証拡張機能を登録し、REST API から解析する属性を追加します。 カスタム認証拡張機能をテストするため、サンプルの OpenID Connect アプリケーションを登録してトークンを取得し、クレームを表示します。

前提条件

手順 1: カスタム認証拡張機能を登録する

ここでは、Microsoft Entra ID が Azure 関数を呼び出すために使用するカスタム認証拡張機能を構成します。 カスタム認証拡張機能には、REST API エンドポイントに関する情報、REST API から解析するクレーム、REST API に対する認証方法が含まれています。 次の手順のようにして、カスタム認証拡張機能を Azure 関数 アプリに登録します。

注意

最大 100 個のカスタム拡張機能ポリシーを使用できます。

カスタム認証拡張機能を登録する

  1. アプリケーション管理者および認証管理者以上の権限で Azure portal にサインインします。
  2. [Microsoft Entra ID] を検索して選択し、[エンタープライズ アプリケーション] を選択します。
  3. [カスタム認証拡張機能] を選択して、[カスタム拡張機能の作成] を選択します。
  4. [基本] でイベントの種類に [TokenIssuanceStart] を選択し、[次へ] を選択します。
  5. [エンドポイントの構成] で、次のプロパティを入力します。
    • [名前] - カスタム認証拡張機能の名前。 例: "トークン発行イベント"。
    • [ターゲット URL] - Azure 関数の URL の {Function_Url}。 Azure 関数 アプリの [概要] ページに移動し、作成した関数を選択します。 関数の [概要] ページで、[関数の URL の取得] を選択し、コピー アイコンを使用して customauthenticationextension_extension (システム キー) URL をコピーします。
    • [説明] - カスタム認証拡張機能の説明。
  6. [次へ] を選択します。
  7. [API 認証][アプリの登録を新規作成する] オプションを選んで、"関数アプリ" を表すアプリ登録を作成します。
  8. アプリの名前を指定します (例: Azure Functions 認証イベント API)。
  9. [次へ] を選択します。
  10. [要求] に、カスタム認証拡張機能で REST API から解析されてトークンにマージされる属性を入力します。 次のクレームを追加します。
    • dateOfBirth
    • customRoles
    • apiVersion
    • correlationId
  11. [次へ][作成] の順に選択します。これにより、カスタム認証拡張機能とそれに関連付けられているアプリケーションの登録が登録されます。
  12. [API 認証] の下の [アプリ ID] をメモします。これは、Azure 関数アプリで Azure 関数の認証を構成するために必要です。

カスタム認証拡張機能が作成されたら、API にアクセス許可を付与する必要があります。 カスタム認証拡張機能は、client_credentials を使い、Receive custom authentication extension HTTP requests アクセス許可を使って Azure Function App に対する認証を行います。

  1. 新しいカスタム認証拡張機能の概要ページを開きます。 ID プロバイダーを追加するときに必要になるため、[API 認証] の下にあるアプリ ID を書き留めます。

  2. [API 認証] の下にある [アクセス許可の付与] を選択します。

  3. 新しいウィンドウが開き、サインインすると、カスタム認証拡張機能の HTTP 要求を受信するためのアクセス許可が要求されます。 これで、API に対してカスタム認証拡張機能を認証できるようになります。 [Accept](承認) を選択します。

    管理者の同意を付与する場所を示すスクリーンショット。

手順 2: エンリッチされたトークンを受信するように OpenID Connect アプリを構成する

トークンを取得してカスタム認証拡張機能をテストするには、https://jwt.ms アプリを使用できます。 これは Microsoft 所有の Web アプリケーションであり、トークンのデコードされた内容を表示します (トークンの内容がお使いのブラウザーの外に出ることはありません)。

2.1 テスト Web アプリケーションを登録する

次の手順のようにして、jwt.ms Web アプリケーションを登録します。

  1. Azure portal のホームページで、[Microsoft Entra ID]を選択します。

  2. [アプリの登録]>[新しい登録] の順に選びます。

  3. アプリケーションの名前を入力します。 例: マイ テスト アプリケーション

  4. [サポートされているアカウントの種類] で、 [この組織のディレクトリ内のアカウントのみ] を選択します。

  5. [リダイレクト URI][プラットフォームの選択] ドロップダウンで [Web] を選び、[URL] テキスト ボックスに「https://jwt.ms」と入力します。

  6. [登録] を選んで、アプリの登録を完了します。

    サポートされているアカウントの種類とリダイレクト URI を選ぶ方法を示すスクリーンショット。

  7. アプリの登録の概要ページで、[アプリケーション (クライアント) ID] をコピーします。 後の手順では、アプリ ID を {App_to_enrich_ID} として参照します。 Microsoft Graph では、appId プロパティによって参照されます。

    アプリケーション ID のコピー方法を示すスクリーンショット。

2.2 暗黙的なフローを有効にする

jwt.ms テスト アプリケーションでは、暗黙的なフローを使います。 "マイ テスト アプリケーション" の登録で暗黙的なフローを有効にします。

  1. [管理] で、 [認証] を選択します。
  2. [暗黙的な許可およびハイブリッド フロー] で、[ID トークン (暗黙的およびハイブリッド フローに使用)] チェックボックスをオンにします。
  3. [保存] を選択します。

2.3 クレーム マッピング ポリシーに対してアプリを有効にする

カスタム認証拡張機能から返された属性から、トークンにマップされるものを選ぶには、クレーム マッピング ポリシーを使います。 トークンを拡張できるようにするには、アプリケーション登録によるマップされたクレームの受け入れを明示的に有効にする必要があります。

  1. "マイ テスト アプリケーション" の登録で、[管理][マニフェスト] を選びます。
  2. マニフェストで acceptMappedClaims 属性を見つけて、値を true に設定します。
  3. accessTokenAcceptedVersion2 に設定します。
  4. [保存] を選択して変更を保存します。

次の JSON スニペットでは、これらのプロパティを構成する方法を示します。

{
	"id": "22222222-0000-0000-0000-000000000000",
	"acceptMappedClaims": true,
	"accessTokenAcceptedVersion": 2,  
    ...
}

警告

マルチテナント アプリでは acceptMappedClaims プロパティを true に設定しないでください。悪意のある者がアプリのクレームマッピング ポリシーを作成することを許可してしまう場合があります。 代わりに、カスタム署名キーを構成します

次のステップ「カスタム クレーム プロバイダーをアプリに割り当てる」に進みます。

手順 3: カスタム クレーム プロバイダーをアプリに割り当てる

カスタム認証拡張機能から受け取ったクレームでトークンが発行されるようにするには、カスタム クレーム プロバイダーをアプリケーションに割り当てる必要があります。 これはトークンの対象ユーザーに基づいているため、ID トークンで要求を受け取るにはクライアント アプリケーションにプロバイダーを割り当て、アクセス トークンで要求を受け取るにはリソース アプリケーションにプロバイダーを割り当てる必要があります。 カスタム クレーム プロバイダーは、トークン発行開始イベント リスナーで構成されたカスタム認証拡張機能に依存します。 カスタム クレーム プロバイダーからのクレームのすべてまたはサブセットのどちらを、トークンにマップするかを選択できます。

注意

アプリケーションとカスタム拡張機能の間で作成できる一意の割り当ては 250 個のみです。 複数のアプリに同じカスタム拡張機能呼び出しを適用する場合は、 authenticationEventListeners Microsoft Graph API を使用して、複数のアプリケーションのリスナーを作成することをお勧めします。 これは Azure portal ではサポートされていません。

次の手順のようにして、マイ テスト アプリケーション とカスタム認証拡張機能を接続します。

カスタム認証拡張機能をカスタム クレーム プロバイダー ソースとして割り当てるには、次を行います。

  1. Azure portal のホームページで、[Microsoft Entra ID]を選択します。

  2. [エンタープライズ アプリケーション] を選択し、その後 [管理] で、[すべてのアプリケーション] を選択します。 一覧から[マイ テスト アプリケーション] を選択します。

  3. "マイ テスト アプリケーション" の概要ページで、[管理] に移動し、[シングル サインオン] を選択します。

  4. [属性とクレーム] で、[編集] を選びます。

    アプリのクレームを構成する方法を示すスクリーンショット。

  5. [詳細設定] メニューを展開します。

  6. [カスタム クレーム プロバイダー] の横にある [構成] を選択します。

  7. [Custom claims provider] (カスタム クレーム プロバイダー) ドロップダウン ボックスを展開して、前に作成した "トークン発行イベント" を選びます。

  8. [保存] を選択します。

次に、カスタム クレーム プロバイダーから属性を割り当てます。これは、クレームとしてトークンに発行されている必要があります。

  1. [新しクレームの追加] を選んで、新しいクレームを追加します。 発行するクレームに名前を指定します (例: dateOfBirth)。

  2. [ソース] の下にある [属性] を選択し、[ソース属性] ドロップダウン ボックスから [customClaimsProvider.dateOfBirth] を選択します。

    アプリにクレーム マッピングを追加する方法を示すスクリーンショット。

  3. [保存] を選択します。

  4. このプロセスを繰り返して、[customClaimsProvider.customRoles][customClaimsProvider.apiVersion][customClaimsProvider.correlationId] の属性と、それぞれに対応する名前を追加します。 クレームの名前と属性の名前は一致させることをお勧めします。

手順 4: Azure 関数を保護する

Microsoft Entra カスタム認証拡張機能は、サーバー間フローを使って、HTTP の Authorization ヘッダーで Azure 関数に送信されるアクセス トークンを取得します。 関数を Azure に発行するときは、特に運用環境では、Authorization ヘッダーで送信されるトークンを検証する必要があります。

Azure 関数を保護するには、受信したトークンを Azure Functions 認証イベント API アプリケーション登録で検証するため、次の手順のようにして Azure AD 認証を統合します。 テナントの種類に基づいて、次のいずれかのタブを選択します。

注意

Azure 関数アプリが、カスタム認証拡張機能が登録されているテナントとは異なる Azure テナントでホストされている場合は、[OpenID Connect] タブを選択してください。

4.1 Microsoft Entra ID の ID プロバイダーの使用

ID プロバイダーとして Microsoft Entra を Azure 関数アプリに追加するには、次のステップに従います。

  1. Azure portal で、前に発行した関数アプリを探して選択します。

  2. [設定][認証] を選択します。

  3. [ID プロバイダーの追加] を選びます。

  4. ID プロバイダーとして [Microsoft] を選択します。

  5. テナントの種類として [従業員] を選択します。

  6. [アプリの登録] の下で、[アプリ登録の種類][このディレクトリ内の既存のアプリ登録を選択] を選択し、カスタム クレーム プロバイダーの登録時に前に作成した "Azure Functions 認証イベント API" アプリ登録を選択します。

  7. 発行者 URL https://login.microsoftonline.com/{tenantId}/v2.0 を入力します。ここで、{tenantId} は従業員テナントのテナント ID です。

  8. [クライアント アプリケーション要件] で、[特定のクライアント アプリケーションからの要求を許可する] を選択し、99045fe1-7639-4a75-9d4a-577b6ca3810f を入力します。

  9. [テナント要件] で、[特定のテナントからの要求を許可する] を選択し、従業員テナント ID を入力します。

  10. [認証されていない要求] で、ID プロバイダーとして [HTTP 401 認可されていない] を選択します。

  11. [トークン ストア] オプションをオフにします。

  12. [追加] を選んで、Azure 関数に認証を追加します。

    ワークフォース テナントにいる間に関数アプリに認証を追加する方法を示すスクリーンショット。

4.2 OpenID Connect ID プロバイダーの使用

Microsoft ID プロバイダーを構成した場合は、このステップをスキップします。 そうではなく、カスタム認証拡張機能が登録されているテナントとは異なるテナントで Azure 関数がホストされている場合は、次の手順のようにして関数を保護します。

クライアント シークレットの作成

  1. Azure portal のホーム ページから、[Microsoft Entra ID]>[アプリの登録] を選択します。
  2. 前に作成した "Azure Functions 認証イベント API" アプリの登録を選択します。
  3. [証明書とシークレット]>[Client secrets]\(クライアント シークレット\)>[新しいクライアント シークレット] の順に選択します。
  4. シークレットの有効期限を選択するか、カスタムの有効期間を指定し、説明を追加して、[追加] を選択します。
  5. クライアント アプリケーションのコードで使用できるように、シークレットの値を記録しておきます。 このページからの移動後は、このシークレットの値は "二度と表示されません"。

OpenID Connect ID プロバイダーを Azure 関数アプリに追加します。

  1. 前に発行した関数アプリを探して選択します。

  2. [設定][認証] を選択します。

  3. [ID プロバイダーの追加] を選びます。

  4. ID プロバイダーとして [OpenID Connect] を選びます。

  5. Contoso Microsoft Entra ID などの名前を指定します。

  6. [メタデータ エントリ] で、[ドキュメントの URL] に次の URL を入力します。 {tenantId} を Microsoft Entra テナント ID に置き換えます。

    https://login.microsoftonline.com/{tenantId}/v2.0/.well-known/openid-configuration
    
  7. [アプリの登録] で、前に作成した "Azure Functions 認証イベント API" アプリ登録のアプリケーション ID (クライアント ID) を入力します。

  8. Azure 関数に戻り、[アプリの登録] の下で [クライアント シークレット] を入力します。

  9. [トークン ストア] オプションをオフにします。

  10. [追加] を選んで、OpenID Connect ID プロバイダーを追加します。

ステップ 5: アプリケーションをテストする

カスタム クレーム プロバイダーをテストするには、次のステップに従います。

  1. 新しいプライベート ブラウザーを開き、次の URL に移動してサインインします。

    https://login.microsoftonline.com/{tenantId}/oauth2/v2.0/authorize?client_id={App_to_enrich_ID}&response_type=id_token&redirect_uri=https://jwt.ms&scope=openid&state=12345&nonce=12345
    
  2. {tenantId} は、テナント ID、テナント名、または検証済みドメイン名の 1 つに置き換えます。 たとえば、contoso.onmicrosoft.com のようにします。

  3. {App_to_enrich_ID} を、"マイ テスト アプリケーション" クライアント ID に置き換えます。

  4. ログインすると、https://jwt.ms でデコードされたトークンが表示されます。 Azure 関数からのクレームがデコードされたトークンで提示されていることを確認します (例: dateOfBirth)。

関連項目