Microsoft Entra ID を使用して検索アプリへのアクセスを承認する

Azure AI Search 上に構築された検索アプリケーションで、認証および承認されたアクセスに Microsoft ID プラットフォームを使用できるようになりました。 Azure では、ID プロバイダーは Microsoft Entra ID です。 Microsoft Entra ID を使用する主な利点は、資格情報と API キーをコード内に格納する必要がなくなることです。 Microsoft Entra によって、アプリケーションを実行しているセキュリティ プリンシパル (ユーザー、グループ、またはサービス) が認証されます。 認証が成功すると、Microsoft Entra ID からアプリケーションにアクセス トークンが返されます。アプリケーションでは、このアクセス トークンを使用して Azure AI Search への要求を認可できます。

この記事では、Microsoft Entra ID のクライアントを構成する方法について説明します。

  • 認証の場合は、アプリケーション用のマネージド ID を作成します。 別の種類のセキュリティ プリンシパル オブジェクトを使用することができますが、この記事では、資格情報を管理する必要がないため、マネージド ID を使用します。

  • 承認の場合は、クエリの実行またはインデックス作成ジョブの管理のためのアクセス許可を付与する Azure ロールをマネージド ID に割り当てます。

  • TokenCredential() を呼び出すようにクライアント コードを更新します。 たとえば、新しい SearchClient (エンドポイント、新しい DefaultAzureCredential()) の使用を開始し、Azure.Identity を使用して Microsoft Entra ID 経由で認可できます。

データ プレーンにロールベースのアクセスを構成する

適用対象: Search インデックス データ共同作成者、Search インデックス データ閲覧者、Search サービス共同作成者

この手順では、OAuth2 アクセス トークンを提供するデータ要求の承認ヘッダーを認識するように検索サービスを構成します。

  1. Azure portal にサインインし、検索サービス ページを開きます。

  2. 左側のナビゲーション ペインで [キー] を選択します。

    認証オプションを含むキー ページのスクリーンショット。

  3. [API アクセス制御] オプションを選択します。 柔軟性を求める場合、あるいはアプリを移行する必要がある場合、[両方] をお勧めします。

    オプション 説明
    API キー (既定) 承認するには、要求ヘッダーに管理者またはクエリの API キーが必要です。 ロールは使用されません。
    ロールベースのアクセス制御 次のステップで説明するように、タスクを完了するには、ロール割り当てのメンバーシップが必要です。 また、Authorization ヘッダーも必要です。
    両方 API キーまたはロールベースのアクセス制御のいずれかを使用する要求が有効です。

変更はすぐに有効になりますが、テストする前に数秒待ってください。

検索サービス操作とコンテンツに対するすべてのネットワーク呼び出しでは、選択したオプション (API キー、ベアラー トークン、または [両方] を選択した場合はいずれか) が優先されます。

ポータルでロールベースのアクセス制御を有効にすると、認証に失敗したとき、失敗モードが "http401WithBearerChallenge" になります。

マネージド ID の作成

この手順では、クライアント アプリケーション用のマネージド ID を作成します。

  1. Azure portal にサインインします。

  2. マネージド ID を検索します。

  3. [作成] を選択します

  4. マネージド ID に名前を付け、リージョンを選択します。 次に、[作成] を選択します。

    マネージド ID 作成ウィザードのスクリーンショット。

マネージド ID へのロールの割り当て

次に、検索サービスへのアクセス権をクライアントのマネージド ID に付与する必要があります。 Azure AI Search には、さまざまな組み込みのロールがあります。 カスタム ロールを作成することもできます。

最小限のアクセス許可を付与することをお勧めします。 アプリケーションでクエリのみを処理する必要がある場合、検索インデックス データ閲覧者ロールを割り当てる必要があります。 または、クライアントで検索インデックスの読み取りと書き込みの両方のアクセス権が必要な場合は、検索インデックス データ共同作成者ロールを使用します。

  1. Azure portal にサインインします。

  2. お使いの検索サービスに移動します。

  3. 左側のナビゲーション ペインで [アクセス制御 (IAM)] を選択します。

  4. [+ 追加]>[ロール割り当ての追加] の順に選択します。

    [ロールの割り当ての追加] メニューが開いている [アクセス制御 (IAM)] ページのスクリーンショット。

  5. 該当するロールを選びます。

    • [所有者]

    • Contributor

    • Reader

    • Search Service Contributor

    • 検索インデックス データ共同作成者

    • 検索インデックス データ閲覧者

      Note

      所有者、共同作成者、閲覧者、および検索サービス共同作成者はコントロール プレーン ロールであり、検索インデックス内のデータにアクセスすることはできません。 データ アクセスの場合は、検索インデックス データ共同作成者ロールまたは検索インデックス データ閲覧者ロールのいずれかを選択します。 各ロールのスコープと目的の詳細については、「Search で使用される組み込みロール」を参照してください。

  6. [メンバー] タブで、検索サービスへのアクセス権を付与するマネージド ID を選択します。

  7. [確認と 割り当て] タブで、 [確認と割り当て] を選択して ロールを割り当てます。

アプリケーションで検索サービス、オブジェクト、コンテンツへの包括的なアクセスが必要な場合は、Search Service Contributor や検索インデックス データ共同作成者などの複数のロールを割り当てることができます。

PowerShell を使用してロールを割り当てることもできます。

クライアントで Microsoft Entra 認証を設定する

検索サービスでマネージド ID とロールの割り当てを取得したら、セキュリティ プリンシパルを認証し、OAuth 2.0 トークンを取得するコードをアプリケーションに追加する準備ができました。

ロールベースのアクセス制御には、次のクライアント ライブラリを使用します。

Note

Microsoft Entra ID によって使用される OAuth 2.0 コード付与フローの概要については、OAuth 2.0 コード付与フローを使用した Microsoft Entra Web アプリケーションへのアクセスの承認に関する記事を参照してください。

次の手順では、既存の C# サンプルを参照してコードの変更を示します。

  1. 出発点として、「クイック スタート: Azure SDK を使用したフルテキスト検索」の C# セクションのソース コードを複製します。

    現在、このサンプルでは、キーベースの認証と AzureKeyCredential を使用して SearchClientSearchIndexClient が作成されますが、少し変更して、ロールベースの認証に切り替えることができます。

  2. Azure.Search.Documents NuGet パッケージをバージョン 11.4 以降に更新します。

  3. Azure.Identity ライブラリをインポートして、他の認証手法にアクセスします。

  4. Program.csMain() の先頭で AzureKeyCredential を使用する代わりに、下のコード スニペットのように DefaultAzureCredential を使用します。

    // Create a SearchIndexClient to send create/delete index commands
    SearchIndexClient adminClient = new SearchIndexClient(serviceEndpoint, new DefaultAzureCredential());
    // Create a SearchClient to load and query documents
    SearchClient srchclient = new SearchClient(serviceEndpoint, indexName, new DefaultAzureCredential());
    

ローカル テスト

ユーザー割り当て済みマネージド ID は、Azure 環境でのみ機能します。 このコードをローカル側で実行すると、DefaultAzureCredential は資格情報を使用した認証にフォールバックします。 コードをローカル側で実行する予定の場合は、検索サービスへの必要なアクセス権も与えられていることを確認してください。

  1. クイックスタート サンプルですべての操作を実行するためのロールの割り当てがアカウントにあることを確認します。 インデックスの作成とクエリ実行を両方行うには、"検索インデックス データ閲覧者" と "検索インデックス データ共同作成者" を使用します。

  2. [ツール][オプション][Azure サービス認証] の順に進み、Azure サインオン アカウントを選択します。

これで、認証にロールベースのアクセス制御を利用し、ローカル システムで Visual Studio からプロジェクトを実行できるようになりました。

Note

Azure.Identity のドキュメントには、DefaultAzureCredential および Azure SDK for .NET での Microsoft Entra 認証の使用方法についての詳細も記載されています。 DefaultAzureCredential は、適切な既定の動作で一般的なシナリオを処理して、SDK の使用を簡略化することを目的としています。 開発者がもっと多くの制御が必要な場合や、シナリオが既定の設定で提供されない場合は、他の資格情報の種類を使用する必要があります。

関連項目