アカウント回復要求の検証用のカスタム認証拡張機能を作成する

この記事では、Microsoft Entraアカウントの復旧中に検証済みIDの要求を検証するカスタム認証拡張機能を設定する方法について説明します。 アカウント回復フローでは、イベント リスナーを使用して要求検証プロセスを拡張できます。

  • OnVerifiedIdClaimValidation イベントは、ユーザーがアカウントの回復を開始し、検証済み ID 要求を提示するときに発生します。 権限のあるデータ ソース (人事システム、アプリケーション データベース、従業員レコード システムなど) に対する要求の検証や、合格または失敗の決定の返しなどのアクションを追加できます。

カスタム認証拡張機能を作成するだけでなく、イベントに対して実行するワークフロー アクションを定義する REST API を作成する必要があります。 この記事では、サンプル リポジトリからデプロイされた C# Azure関数の使用を簡単に開始する方法について説明します。 Azure Functionsでは、最初に仮想マシン (VM) を作成したり、Web アプリケーションを発行したりする必要なく、サーバーレス環境でコードを実行できます。

前提条件

どのように機能するのか

アカウントの回復中に、すべての認証方法を失ったユーザーは、ID を再確立する必要があります。 カスタム認証拡張機能は、このフローに要求検証ステップを追加します。

アカウントの回復フローを示すアーキテクチャ図: ユーザーが回復を開始します。 イベント リスナーをトリガー Microsoft Entra ID、カスタム認証拡張機能は REST API エンドポイント (Logic Apps または Azure Functions) を呼び出します。これにより、外部システムに対して検証が行われ、応答が処理され、TAP コードが表示されます。

OnVerifiedIdClaimValidation イベントは、復旧パイプラインの事前証明フックです。 復旧を進める前に、カスタム検証ロジック(HR の照会、外部データベースチェック、パートナー信頼の検証)を適用できます。

手順 1: カスタム認証拡張機能 REST API を作成する (Azure関数アプリ)

この手順では、カスタム認証拡張機能の REST API として機能するAzure関数アプリをデプロイします。 この関数は、アカウントの復旧中にMicrosoft Entra IDから検証済み ID 要求を受け取り、権限のあるデータ ソースに対して検証します。

サンプル関数は、ワンクリックデプロイとして使用できます。 Application Insights とストレージ アカウントを使用して、従量課金プランに Azure Function App (.NET 10 の分離ワーカー モデル) をデプロイします。

1.1 Azure関数をデプロイする

  1. [Azure] ボタンを選択します。

    Azure にデプロイする

  2. デプロイ パラメーターを入力します。

    パラメーター Description
    関数アプリ名 Function App のグローバルに一意の名前 (たとえば、 contoso-recovery-claims)。
    リポジトリ URL GitHub リポジトリの URL が事前に入力されています。
    ブランチ main
    ストレージ アカウントの種類 Standard_LRS (既定値)。
    場所 ユーザーの近くのAzureリージョンを選択します。

    ここでは省略可能なパラメーターを空白のままにします。次の手順で構成します。

  3. [ 確認と作成]、[ 作成] の順に選択します。

  4. デプロイが完了するまで待ちます (通常は 2 ~ 3 分)。

Note

ARM テンプレートは、 従量課金プラン (Y1/動的レベル) に Function App をデプロイします。 スケーリングは完全に自動化されます。Azureは、受信要求ボリュームに基づいてインスタンスを追加および削除します。 テストまたは開発の場合は、コールド スタートを回避するために Premium プラン (EP1 以降) に切り替えることができます。 プランを変更するには、Function App >App Service プラン>Change App Service プランに移動>目的のレベルでプランを選択または作成します。

1.2 関数の URL を取得する

  1. デプロイが完了したら、Function App リソースに移動します。
  2. [ 関数>CustomClaimMatching>関数の URL を取得 を選択します。
  3. URL をコピーします。 https://<your-function-app>.azurewebsites.net/api/CustomClaimMatching のように表示されます。

1.3 テスト データ ソースを構成する

テスト用に、この関数は、データ ソースとして読み取りアクセス権を持つ任意の Web サーバーでホストされているExcel ファイルをサポートします。 運用環境では、HR API プロバイダーに切り替えることができます (運用 への切り替え: HR API プロバイダーの使用を参照)。

  1. リポジトリの SampleData フォルダーからサンプル Excel ファイルをダウンロードするか、次の列を使用して独自のファイルを作成します。

    社員ID UPN firstName lastName fullName dateOfBirth ドキュメントタイプ documentId 文書有効期限
    E001 user@contoso.com John 雌鹿 John Doe 1990-01-15 Passport AB123456 2028-01-15

    Tip

    新しい要求を追加するには、要求名をヘッダーとして持つ列を追加します。 この関数は、要求からの要求キーと列ヘッダーを動的に照合します。コードの変更は必要ありません。

    Note

    既定では、関数アプリは ドキュメント番号 (documentId) 要求のみを検証します。 firstNamedateOfBirthemployeeId などの追加の要求を照合するには、Azure関数コードで検証ロジックを更新します。

  2. Web サーバー、ファイル共有、またはクラウド ストレージ サービス (Azure Blob Storage、SharePoint、HTTP アクセス可能な場所など) にファイルをアップロードします。

  3. ファイルの直接ダウンロード URL を取得します。 対話型サインインなしで URL にアクセスできる必要があります。

  4. Azure ポータルで、Function App の>設定>環境変数に移動します。 デプロイ テンプレートでは、これらの変数が既定値で事前に作成されます。 次のことを確認して更新します。

    名前 アクション 価値
    ClaimsValidator__Provider 確認 ( excelとして事前に作成済み) excel
    Excel__ShareUrl 更新(空のまま事前に作成された) Excel ファイルの直接ダウンロード URL。
    Excel__SheetName 確認 ( Sheet1として事前に作成済み) Sheet1 (またはワークシート名)。
  5. [適用] を選んでから、[確認] を選びます。

手順 2: カスタム認証拡張機能を作成して登録する

この手順では、Azure関数の呼び出しに使用Microsoft Entra IDカスタム認証拡張機能を登録します。 カスタム認証拡張機能には、REST API エンドポイント、REST API から解析する要求検証アクション、および REST API に対する認証方法に関する情報が含まれています。

Note

最大 100 個のカスタム拡張機能ポリシーを使用できます。 ただし、OnVerifiedIdClaimValidation イベントの種類では、テナントごとに 1 つのカスタム認証拡張機能のみが許可されます。

  1. Microsoft Entra管理センターに少なくともアプリケーション管理者および認証管理者としてサインインします。

  2. Entra ID>Enterprise apps>Custom 認証拡張機能に移動します。

  3. [ カスタム拡張機能の作成] を選択します

  4. [基本] で OnVerifiedIdClaimValidation イベントを選択し、[次へ] を選択します。

  5. エンドポイント構成で、次のプロパティを入力します。

    • 名前: カスタム認証拡張機能の名前。 たとえば、「 Account Recovery Claims Validation 」のように入力します。
    • Target URL: Azure Function の URL。 例えば: https://<your-function-app>.azurewebsites.net/api/CustomClaimMatching
    • 説明: 拡張機能の説明。 たとえば、「 Validates VID claims against HR data during account recovery 」のように入力します。
  6. 次へを選択します。

  7. API 認証で、[新しいアプリ登録の作成] オプションを選択して、関数アプリを表すアプリ登録を作成します。

  8. アプリに名前を付けます (例: Azure Functions authentication events API)。

  9. 次へを選択します。

  10. [ 作成] を選択すると、カスタム認証拡張機能と関連付けられているアプリケーションの登録が作成されます。

カスタム認証拡張機能が作成された後は、登録済みアプリに管理者の同意を付与します。これにより、カスタム認証拡張機能が API に対する認証を行えるようになります。

  1. Entra ID>Enterprise apps>Custom 認証拡張機能に移動します。
  2. 一覧からカスタム認証拡張機能を選択します。
  3. [ 概要 ] タブで、[ アクセス許可の付与 ] ボタンを選択して、登録済みのアプリに管理者の同意を与えます。 カスタム認証拡張機能では、client_credentials を使用して、Receive custom authentication extension HTTP requests アクセス許可を使用してAzure関数アプリに対する認証を行います。 [Accept](承認) を選択します。

手順 3: カスタム認証拡張機能をアカウント回復ポリシーに追加する

次に、カスタム認証拡張機能を ID 検証プロファイルのアカウント検証設定に関連付け、復旧フロー中に呼び出されるようにします。

  1. Microsoft Entra管理センターに少なくともアプリケーション管理者および認証管理者としてサインインします。

  2. Entra ID>アカウント回復>本人確認プロファイルに移動します。

  3. 更新する ID 検証プロファイルを選択します (または、新しく作成します)。

  4. [アカウントの検証] ステップで、[追加の要求の検証] で [有効][オン] に切り替えます。

  5. [ 選択した拡張機能 ] ドロップダウンで、手順 2 で作成したカスタム認証拡張機能 (Account Recovery Claims Validation) を選択します。

    カスタム認証拡張機能が選択された ID 検証プロファイルを示すスクリーンショット。

  6. [ 確認して最終処理]、[ 保存] の順に選択します。

手順 4: 関数をテストする (認証を追加する前に)

認証を構成する前に (手順 5) 、関数の要求照合ロジックが直接呼び出されて機能することを確認します。 この時点で、関数には認証が構成されていない必要があります。EasyAuth ID プロバイダーは構成されておらず、 EntraId__TenantId / EntraId__ClientId 環境変数は空である必要があります。

4.1 関数を直接テストする

Warnung

この手順では、認証が構成されていない状態で関数をテストします。 これは開発とテスト専用です。 運用環境では、認証なしで関数を公開しないでください。 運用環境にデプロイする前に、手順 5 を完了して認証を構成します。

Note

認証 ID プロバイダーが構成されていない場合でも、Azure Functionsには Authorization: Bearer ヘッダーが必要です。 ローカル テスト中に任意の値 (たとえば、 Bearer test) を渡すことができます。 運用環境では、Microsoft Entra IDは有効なトークンを自動的に提供します。

  1. ターミナルを開き、次のコマンドを実行します。

    $body = @'
    {
        "type": "microsoft.graph.authenticationEvent.verifiedIdClaimValidation",
        "source": "/tenants/<tenant-guid>/applications/<app-id>",
        "data": {
            "@odata.type": "microsoft.graph.onVerifiedIdClaimValidationCalloutData",
            "tenantId": "<tenant-guid>",
            "authenticationContext": {
                "correlationId": "00000000-0000-0000-0000-000000000001",
                "user": {
                    "userPrincipalName": "user@contoso.com"
                }
            },
            "verifiedIdClaimsContext": {
                "additionalInfo": {
                    "employeeId": "E001"
                },
                "claims": {
                    "firstName": "John",
                    "lastName": "Doe",
                    "dateOfBirth": "1990-01-15"
                }
            }
        }
    }
    '@
    
    (Invoke-WebRequest -Method Post `
      -Uri "https://<your-function-app>.azurewebsites.net/api/CustomClaimMatching" `
      -ContentType "application/json" `
      -Headers @{ Authorization = "Bearer test" } `
      -Body $body).Content
    
  2. 応答を確認します。

    成功した一致:

    {
        "data": {
            "@odata.type": "microsoft.graph.onVerifiedIdClaimValidationResponseData",
            "actions": [
                {
                    "@odata.type": "microsoft.graph.verifiedIdClaimValidation.pass"
                }
            ]
        }
    }
    

    一致しませんでした(一致しなかったクレームを返します):

    {
        "data": {
            "@odata.type": "microsoft.graph.onVerifiedIdClaimValidationResponseData",
            "actions": [
                {
                    "@odata.type": "microsoft.graph.verifiedIdClaimValidation.failed",
                    "failedClaims": ["dateOfBirth"]
                }
            ]
        }
    }
    

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

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

Azure関数を保護するには、次の手順に従って、受信トークンを検証するためのMicrosoft Entra認証を Azure Functions 認証イベント API アプリケーションの登録と統合します。

5.1 Azure関数に ID プロバイダーを追加する

  1. Azure ポータルにサインインします。
  2. 以前にデプロイした Function App に移動して選択します。
  3. 左側のメニューで [ 認証 ] を選択します。
  4. [ ID プロバイダーの追加] を選択します
  5. ID プロバイダーとして Microsoft を選択します。
  6. [ テナントの選択] で、[ Workforce configuration (current tenant)]\(ワークフォース構成 (現在のテナント)\) を選択します。
  7. App registration で、このディレクトリ内の既存のアプリ登録を選択を選択し、手順 2 で作成した Azure Functions 認証イベント API アプリの登録を選択します。
  8. [ クライアント シークレットの有効期限] で、有効期限を選択します。
  9. [ サポートされているアカウントの種類] で、[ 現在のテナント - シングル テナント] を選択します。
  10. 追加のチェックの下で次の手順を実行します。
    • Client アプリケーション要件:特定のクライアント アプリケーションからの要求を許可を選択し、99045fe1-7639-4a75-9d4a-577b6ca3810f を追加します (これは、Microsoft Entra のカスタム認証拡張機能のファーストパーティアプリ ID です)。
    • ID 要件: [ 任意の ID からの要求を許可する] を選択します
    • テナントの要件: [ 特定のテナントからの要求を許可する ] を選択し、従業員テナント ID を入力します。
  11. [ 認証されていない要求] で、[ HTTP 401 Unauthorized: APIに推奨] を選択します。
  12. Issuer URL に「https://login.microsoftonline.com/{tenantId}/v2.0」と入力します。ここで、{tenantId} はMicrosoft Entra テナントのテナント ID です。
  13. [トークン ストア] オプションの選択を解除します。
  14. Add を選択して、Azure関数に認証を追加します。

5.2 OpenID Connect ID プロバイダーを使用する

Azure関数が、カスタム認証拡張機能が登録されているテナントとは異なるテナントでホストされている場合は、代わりに次の手順に従います。

  1. Azure ポータルにサインインし、Function App に移動します。
  2. 左側のメニューで [ 認証 ] を選択します。
  3. [ ID プロバイダーの追加] を選択します
  4. ID プロバイダーとして OpenID Connect を選択します。
  5. Contoso Microsoft Entra ID などの名前を指定します。
  6. Metadata エントリで、Document URL に次の URL を入力し、{tenantId}をMicrosoft Entraテナント ID に置き換えます。
    https://login.microsoftonline.com/{tenantId}/v2.0/.well-known/openid-configuration
    
  7. App registration で、手順 2 で作成したAzure Functions認証イベント API アプリ登録のアプリケーション ID (クライアント ID) を入力します。
  8. Microsoft Entra 管理センターで、Azure Functions 認証イベント API アプリ登録の証明書 & シークレットクライアント シークレットに移動し、新しいクライアント シークレットを作成します。 シークレット値をコピーします。
  9. Azure関数に戻り、Client シークレットを入力します。
  10. [トークン ストア] オプションの選択を解除します。
  11. OpenID Connect ID プロバイダーを追加するには、[ 追加] を選択します。

手順 6: エンドツーエンドの復旧フローをテストする

  1. Microsoft Entra 管理センターにサインインし、カスタム認証拡張機能がアクティブであり、ID 検証プロファイルに割り当てられているかどうかを確認します (手順 3)。

  2. プライベート ブラウザー ウィンドウで、 https://myaccount.microsoft.com に移動し、アカウントの回復を開始します。

  3. ID 証明の手順 (顔チェック、検証済み ID プレゼンテーション) を完了します。

  4. OnVerifiedIdClaimValidation イベントが発生し、Azure関数が呼び出されます。 この関数は、データ ソースに対する要求を検証し、成功または失敗を返します。

  5. Application Insights で>関数が呼び出され、要求が検証されたことを確認します。

    traces
    | where message has "claims" or message has "validation"
    | order by timestamp desc
    | take 20
    

運用環境に切り替える: HR API プロバイダーを使用する

運用環境では、Excel プロバイダーから、組織の HR REST エンドポイントを呼び出す HR API プロバイダーに切り替えます。

  1. 関数アプリの 環境変数で、次を更新します。

    名前 価値
    ClaimsValidator__Provider hrapi
    HrApi__BaseUrl HR API のベース URL (たとえば、 https://hr.contoso.com/api)。
    HrApi__AuthMode apikey または oauth
    HrApi__ApiKey API キー (認証モード apikey 使用している場合)。
    HrApi__OAuthScope OAuth スコープ (認証モード oauth 使用している場合、たとえば、 api://hr-api-app-id/.default)。
  2. oauth認証モードを使用する場合、関数は Function App のシステム割り当てマネージド ID を使用します。 マネージド ID に、HR API のアプリ登録に対する適切なアプリ ロールを付与します。

  3. HR API では、次のコントラクトを実装する必要があります。

    要求:POST {BaseUrl}/validate

    {
        "upn": "user@contoso.com",
        "employeeId": "E001",
        "claims": {
            "firstName": "John",
            "lastName": "Doe",
            "dateOfBirth": "1990-01-15"
        }
    }
    

    応答 (パス):

    {
        "result": "pass"
    }
    

    応答 (失敗):

    {
        "result": "fail",
        "failedClaims": ["dateOfBirth"]
    }
    

Troubleshoot

症状 原因 Resolution
関数が返す 401 ベアラー トークンの検証に失敗したか、ID プロバイダーが構成されていません。 Function App Authentication (手順 5) で ID プロバイダーが追加され、クライアント ID がアプリの登録と一致するかどうかを確認します。
関数は 200 を返しますが、復旧フローは失敗します 応答スキーマの不一致。 関数が応答で正しい @odata.type 値を返すかどうかを確認します。
要求は常に検証に失敗する データ ソースが一致しません。 Excel列ヘッダーまたは HR API 応答が要求キーと正確に一致するかどうかを確認します (大文字と小文字は区別されません)。
復旧中に呼び出されない関数 イベント リスナーが構成されていません。 カスタム認証拡張機能がアカウント回復ポリシーに割り当てられているかどうかを確認します (手順 3)。
Excelでデータが読み込まれない 共有 URL が無効または期限切れです。 Excel ファイルを再共有し、環境変数で Excel__ShareUrl を更新します。
管理者の同意が付与されていません 拡張機能呼び出しのアクセス許可エラー。 カスタム認証拡張機能 >Overview>アクセス権を付与>承認 に移動します。

トラブルシューティングのガイダンスの詳細については、「 カスタム認証拡張機能 API のトラブルシューティング」を参照してください