カスタム クレーム プロバイダー API のトラブルシューティング
認証イベントとカスタム クレーム プロバイダーを使用すると、外部システムと統合することで、Microsoft Entra 認証エクスペリエンスをカスタマイズできます。 たとえば、カスタム クレーム プロバイダー API を作成し、外部ストアからクレームを含むトークンを受信するように OpenID Connect アプリまたは SAML アプリを構成できます。
エラー動作
API 呼び出しが失敗すると、エラーの動作は次のようになります。
- OpenId Connect アプリの場合 - Microsoft Entra ID は、ユーザーをエラーとともにクライアント アプリケーションにリダイレクトします。 トークンは作成されません。
- SAML アプリの場合 - Microsoft Entra ID は、認証エクスペリエンスでユーザーにエラー画面を表示します。 ユーザーはクライアント アプリケーションにリダイレクトされません。
アプリケーションまたはユーザーに送り返されるエラー コードは汎用的です。 トラブルシューティングを行うには、サインイン ログでエラー コードを確認します。
ログ記録
カスタム クレーム プロバイダー REST API エンドポイントに関する問題をトラブルシューティングするには、REST API でログ記録を処理する必要があります。 Azure Functions やその他の API 開発プラットフォームには、詳細なログ記録ソリューションが用意されています。 それらのソリューションを使用して、API の動作に関する詳細情報を取得し、API ロジックのトラブルシューティングを行います。
Microsoft Entra サインイン ログ
ヒント
この記事の手順は、開始するポータルに応じて若干異なる場合があります。
REST API ログに加えて、Microsoft Entra サインイン ログやホスティング環境診断ソリューションも使用できます。 Microsoft Entra サインイン ログを使用すると、ユーザーのサインインに影響する可能性があるエラーを見つけることができます。Microsoft Entra サインイン ログには、API が Microsoft Entra ID によって呼び出されたときに発生した HTTP 状態、エラー コード、実行時間、再試行回数に関する情報が表示されます。
Microsoft Entra サインイン ログも Azure Monitor と統合されます。 アラートと監視を設定し、データを視覚化し、セキュリティ情報イベント管理 (SIEM) ツールと統合できます。 たとえば、エラーの数が選択した特定のしきい値を超えた場合の通知を設定できます。
Microsoft Entraサインイン ログにアクセスするには:
クラウド アプリケーション管理者以上として Microsoft Entra 管理センターにサインインします。
[ID]>[アプリケーション]>[エンタープライズ アプリケーション] の順に移動します。
サインイン ログ を選択し、最新のサインイン ログを選択します。
詳細については、[認証イベント] タブを選択します。カスタム拡張機能 REST API 呼び出しに関連する情報が、エラー コード を含めて表示されます。
エラー コードのリファレンス
次の表を使用して、エラー コードを診断します。
エラー コード | エラー名 | Description |
---|---|---|
1003000 | EventHandlerUnexpectedError | イベント ハンドラーの処理時に予期しないエラーが発生しました。 |
1003001 | CustomExtenstionUnexpectedError | カスタム拡張機能 API の呼び出し中に予期しないエラーが発生しました。 |
1003002 | CustomExtensionInvalidHTTPStatus | カスタム拡張 API から無効な HTTP 状態コードが返されました。 API から、そのカスタム拡張機能の種類に対して定義されている「受理されました」ステータス コードが返されることを確認します。 |
1003003 | CustomExtensionInvalidResponseBody | カスタム拡張機能の応答本文の解析で問題が発生しました。 API 応答本文のスキーマが、そのカスタム拡張機能の種類に対して受け入れ可能であることを確認します。 |
1003004 | CustomExtensionThrottlingError | カスタム拡張機能の要求が多すぎます。 この例外は、スロットリングの制限に達したときにカスタム拡張 API 呼び出しに対してスローされます。 |
1003005 | CustomExtensionTimedOut | カスタム拡張機能が、許可されたタイムアウト内に応答しませんでした。 カスタム拡張機能の構成済みタイムアウト内に API が応答していることを確認します。 アクセス トークンが無効であることを示している可能性もあります。 REST API を直接呼び出す手順に従います。 |
1003006 | CustomExtensionInvalidResponseContentType | カスタム拡張機能の応答コンテンツ タイプが 'application/json' ではありません。 |
1003007 | CustomExtensionNullClaimsResponse | カスタム拡張 API が null の要求バッグで応答しました。 |
1003008 | CustomExtensionInvalidResponseApiSchemaVersion | カスタム拡張 API が、呼び出されたのと同じ apiSchemaVersion で応答しませんでした。 |
1003009 | CustomExtensionEmptyResponse | カスタム拡張 API の応答本文が予期していない null でした。 |
1003010 | CustomExtensionInvalidNumberOfActions | カスタム拡張 API 応答に、そのカスタム拡張機能の種類でサポートされているものとは異なる数のアクションが含まれていました。 |
1003011 | CustomExtensionNotFound | イベント リスナーに関連付けられているカスタム拡張機能が見つかりませんでした。 |
1003012 | CustomExtensionInvalidActionType | カスタム拡張機能が、そのカスタム拡張機能の種類に対して定義されている無効なアクションの種類を返しました。 |
1003014 | CustomExtensionIncorrectResourceIdFormat | カスタム拡張機能のアプリケーション登録のマニフェストの "identifierUris" プロパティは、"api://{ully qualified domain name}/{appid} の形式にする必要があります。 |
1003015 | CustomExtensionDomainNameDoesNotMatch | カスタム拡張機能の targetUrl と resourceId には、同じ完全修飾ドメイン名が必要です。 |
1003016 | CustomExtensionResourceServicePrincipalNotFound | カスタム拡張機能の resourceId の appId は、テナント内の実際のサービス プリンシパルに対応している必要があります。 |
1003017 | CustomExtensionClientServicePrincipalNotFound | カスタム拡張機能のリソース サービス プリンシパルがテナントに見つかりません。 |
1003018 | CustomExtensionClientServiceDisabled | カスタム拡張機能のリソース サービス プリンシパルがテナントで無効になっています。 |
1003019 | CustomExtensionResourceServicePrincipalDisabled | カスタム拡張機能のリソース サービス プリンシパルがテナントで無効になっています。 |
1003020 | CustomExtensionIncorrectTargetUrlFormat | ターゲット URL の形式が正しくありません。 https で始まる有効な URL である必要があります。 |
1003021 | CustomExtensionPermissionNotGrantedToServicePrincipal | サービス プリンシパルには、Microsoft Graph の CustomAuthenticationExtensions.Receive.Payload アプリ ロール (アプリケーションのアクセス許可とも呼ばれます) に関する管理者の同意がありません。これは、アプリがカスタム認証拡張機能の HTTP 要求を受信するために必須です。 |
1003022 | CustomExtensionMsGraphServicePrincipalDisabledOrNotFound | MS Graph サービス プリンシパルが無効になっているか、このテナントで見つかりません。 |
1003023 | CustomExtensionBlocked | カスタム拡張機能に使用されるエンドポイントは、サービスによってブロックされています。 |
1003024 | CustomExtensionResponseSizeExceeded | カスタム拡張機能の応答サイズが上限を超えました。 |
1003025 | CustomExtensionResponseClaimsSizeExceeded | カスタム拡張機能応答の要求の合計サイズが上限を超えました。 |
1003026 | CustomExtensionNullOrEmptyClaimKeyNotSupported | カスタム拡張 API が、null または空のキーを含む要求で応答しました。 |
1003027 | CustomExtensionConnectionError | カスタム拡張 API への接続中にエラーが発生しました。 |
REST API を直接呼び出してください
REST API は Microsoft Entra アクセス トークンによって保護されています。 次の方法で API をテストできます:
- カスタム認証拡張機能に関連付けられているアプリケーション登録でアクセス トークンを取得する
- API テスト ツールを使用して API をローカルでテストします。
ローカルでの開発とテストの目的で、[local.settings.json] を開き、コードを次の JSON に置き換えます。
{ "IsEncrypted": false, "Values": { "AzureWebJobsStorage": "", "AzureWebJobsSecretStorageType": "files", "FUNCTIONS_WORKER_RUNTIME": "dotnet", "AuthenticationEvents__BypassTokenValidation" : false } }
Note
NuGet パッケージ Microsoft.Azure.WebJobs.Extensions.AuthenticationEvents を使用した場合は、必ずローカル テスト用に
"AuthenticationEvents__BypassTokenValidation" : true
を設定してください。好みの API テスト ツールを使用して、新しい HTTP 要求を作成し、HTTP メソッド を
POST
に設定します。Microsoft Entra ID から REST API に送信される要求を模倣する次の JSON 本文を使用します。
{ "type": "microsoft.graph.authenticationEvent.tokenIssuanceStart", "source": "/tenants/aaaabbbb-0000-cccc-1111-dddd2222eeee/applications/00001111-aaaa-2222-bbbb-3333cccc4444", "data": { "@odata.type": "microsoft.graph.onTokenIssuanceStartCalloutData", "tenantId": "aaaabbbb-0000-cccc-1111-dddd2222eeee", "authenticationEventListenerId": "11112222-bbbb-3333-cccc-4444dddd5555", "customAuthenticationExtensionId": "22223333-cccc-4444-dddd-5555eeee6666", "authenticationContext": { "correlationId": "aaaa0000-bb11-2222-33cc-444444dddddd", "client": { "ip": "127.0.0.1", "locale": "en-us", "market": "en-us" }, "protocol": "OAUTH2.0", "clientServicePrincipal": { "id": "aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb", "appId": "00001111-aaaa-2222-bbbb-3333cccc4444", "appDisplayName": "My Test application", "displayName": "My Test application" }, "resourceServicePrincipal": { "id": "aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb", "appId": "00001111-aaaa-2222-bbbb-3333cccc4444", "appDisplayName": "My Test application", "displayName": "My Test application" }, "user": { "companyName": "Casey Jensen", "createdDateTime": "2023-08-16T00:00:00Z", "displayName": "Casey Jensen", "givenName": "Casey", "id": "00aa00aa-bb11-cc22-dd33-44ee44ee44ee", "mail": "casey@contoso.com", "onPremisesSamAccountName": "Casey Jensen", "onPremisesSecurityIdentifier": "<Enter Security Identifier>", "onPremisesUserPrincipalName": "Casey Jensen", "preferredLanguage": "en-us", "surname": "Jensen", "userPrincipalName": "casey@contoso.com", "userType": "Member" } } } }
ヒント
Microsoft Entra ID から取得したアクセス トークンを使用している場合は、[認可] を選択し、[ベアラー トークン]を選択し、Microsoft Entra ID から受け取ったアクセス トークンを貼り付けます。
[送信] を選択すると、次のような JSON 応答が表示されます。
{ "data": { "@odata.type": "microsoft.graph.onTokenIssuanceStartResponseData", "actions": [ { "@odata.type": "microsoft.graph.tokenIssuanceStart.provideClaimsForToken", "claims": { "customClaim1": "customClaimValue1", "customClaim2": [ "customClaimString1", "customClaimString2" ] } } ] } }
一般的なパフォーマンスの大幅な向上
最も一般的な問題の 1 つは、カスタム クレーム プロバイダー API が 2 秒以内に応答しないでタイムアウトになることです。 REST API が後続の再試行で応答しない場合、認証は失敗します。 REST API のパフォーマンスを向上させるには、以下の推奨事項に従います。
- API がダウンストリーム API にアクセスする場合は、すべての実行で新しいトークンを取得する必要はなくなるように、これらの API の呼び出しに使用されるアクセス トークンをキャッシュします。
- パフォーマンスの問題は、多くの場合、ダウンストリーム サービスに関連しています。 ログ記録を追加します。これにより、ダウンストリーム サービスへの呼び出しの処理時間が記録されます。
- クラウド プロバイダーを使用して API をホストしている場合は、API を常に "ウォーム" に保つホスティング プランを使用します。 Azure Functions の場合、これは Premium プランまたは専用プランです。
- 認証の自動統合テストを実行します。 API テスト ツールを使用して、API のパフォーマンスのみをテストすることもできます。