Поделиться через


Подключение приложения к Поиск с использованием ИИ Azure с помощью идентификаций

В коде приложения можно настроить подключение без ключа к Поиск с использованием ИИ Azure, использующее Microsoft Entra ID и роли для проверки подлинности и авторизации. Запросы приложений к большинству служб Azure должны проходить проверку подлинности с помощью ключей или бессерверных подключений. Разработчики должны уделять внимание тому, чтобы не раскрыть ключи в незащищенном расположении. Любой, кто получает доступ к ключу, может пройти проверку подлинности в службе. Аутентификация без использования ключей обеспечивает улучшенные возможности управления и безопасности по сравнению с ключом доступа к учетной записи, так как для хранения ключа (или строки подключения) нет необходимости.

В этой статье объясняется, как использовать DefaultAzureCredential в коде приложения.

Чтобы реализовать бессерверные подключения в коде, выполните следующие действия.

  • Включение доступа на основе ролей в службе поиска
  • При необходимости задайте переменные среды.
  • Используйте тип учетных данных библиотеки удостоверений Azure для создания объекта клиента Поиск с использованием ИИ Azure.

Предпосылки

  • Поиск с использованием ИИ Azure, любой регион, но он должен быть платным (базовым или более высоким).

  • Доступ на основе ролей включен в службе поиска.

  • Назначения ролей в Поиск с использованием ИИ Azure. Назначьте эти роли вашей учетной записи.

    • Участник службы поиска и участник данных индекса поиска для локальной разработки (полный доступ)
    • Модуль чтения данных индекса поиска для рабочих запросов на только чтение

    Пошаговые инструкции см. в разделе "Назначение ролей для разработки".

Установка клиентской библиотеки удостоверений Azure

Чтобы использовать безключевой подход, обновите код с поддержкой поиска, включенного ИИ, с помощью клиентской библиотеки удостоверений Azure.

Установите клиентную библиотеку Azure Identity для .NET и клиентную библиотеку Azure Search Documents:

dotnet add package Azure.Identity
dotnet add package Azure.Search.Documents

Обновление исходного кода для использования DefaultAzureCredential

Библиотека идентификации Azure DefaultAzureCredential позволяет выполнять один и тот же код как в локальной среде разработки, так и в облаке Azure. Создайте единые учетные данные и повторно используйте экземпляр этих данных по мере необходимости, чтобы воспользоваться преимуществами кеширования токенов.

Дополнительные сведения о DefaultAzureCredential для .NET см. в клиентской библиотеке Azure Identity для .NET.

using Azure;
using Azure.Search.Documents;
using Azure.Search.Documents.Indexes;
using Azure.Search.Documents.Indexes.Models;
using Azure.Search.Documents.Models;
using Azure.Identity;
using System;
using static System.Environment;

string endpoint = GetEnvironmentVariable("AZURE_SEARCH_ENDPOINT");
string indexName = "my-search-index";

DefaultAzureCredential credential = new();
SearchClient searchClient = new(new Uri(endpoint), indexName, credential);
SearchIndexClient searchIndexClient = new(endpoint, credential);

Reference:SearchClient, SearchIndexClient, DefaultAzureCredential

Проверка подключения

После настройки клиента проверьте подключение, выполнив простую операцию. В следующем примере перечислены индексы в службе поиска:

// List indexes to verify connection
var indexes = searchIndexClient.GetIndexNames();
foreach (var name in indexes)
{
    Console.WriteLine(name);
}

Успешное подключение выводит имена индексов (или пустой список, если индексы отсутствуют). Если вы сталкиваетесь с ошибкой аутентификации, убедитесь, что доступ на основе ролей активирован, а идентификация имеет необходимые назначения ролей.

Авторитет по умолчанию — это общедоступное облако Azure. К пользовательским audience значениям для национальных или специализированных облаков относятся:

  • https://search.azure.us для Azure для государственных организаций
  • https://search.azure.cn для Azure, управляемого 21Vianet
  • https://search.microsoftazure.de для Azure для Германии

Локальная разработка

Локальная разработка с помощью ролей включает следующие действия.

  • Назначьте личную учетную запись ролям RBAC на конкретном ресурсе.
  • Используйте средство, например Azure CLI или Azure PowerShell для проверки подлинности с помощью Azure.
  • Установите переменные среды для ресурса.

Роли для локальной разработки

Как локальный разработчик, ваше Azure удостоверение нуждается в полном контроле над операциями плоскости данных. Ниже приведены предлагаемые роли:

  • Участник службы поиска, создание объектов и управление ими
  • Участник данных индекса поиска: загрузка, запрос индекса и извлечение из базы знаний

Найдите свое личное удостоверение с помощью одного из следующих средств. Используйте это удостоверение в качестве значения <identity-id>.

Замените заполнители <role-name>, <identity-id><subscription-id>и <resource-group-name> фактическими значениями в следующих командах.

  1. Войдите в Azure CLI.

    az login
    

    Откроется окно браузера для проверки подлинности. После успешного входа терминал отображает сведения о подписке.

  2. Получите свое личное удостоверение.

    az ad signed-in-user show \
        --query id -o tsv
    

    Команда возвращает идентификатор объекта пользователя (GUID). Сохраните это значение для следующего шага.

  3. Назначьте учётной записи роль управления доступом на основе ролей (RBAC) для данной группы ресурсов.

    az role assignment create \
        --role "<role-name>" \
        --assignee "<identity-id>" \
        --scope "/subscriptions/<subscription-id>/resourceGroups/<resource-group-name>"
    

    Успешное назначение возвращает объект JSON с подробными сведениями о назначении ролей.

Проверка подлинности для локальной разработки

Используйте средство в локальной среде разработки для аутентификации с удостоверением Azure. После того как вы прошли проверку подлинности, экземпляр DefaultAzureCredential в вашем исходном коде находит и использует ваше удостоверение для целей аутентификации.

Выберите средство для проверки подлинности во время локальной разработки.

Настройка переменных среды для локальной разработки

Чтобы подключиться к Поиск с использованием ИИ Azure, коду необходимо знать конечную точку ресурса.

Создайте переменную среды с именем AZURE_SEARCH_ENDPOINT для конечной точки Поиск с использованием ИИ Azure. Этот URL-адрес обычно имеет формат https://<YOUR-RESOURCE-NAME>.search.windows.net/.

Нагрузки в производственной среде

Развертывание рабочих нагрузок включает следующие действия.

  • Выберите роли RBAC, которые соответствуют принципу наименьших привилегий.
  • Назначьте роли RBAC для производственной учётной записи на конкретном ресурсе.
  • Настройте переменные среды для ресурса.

Роли для производственных рабочих нагрузок

Чтобы создать производственные ресурсы, необходимо создать управляемое удостоверение, назначенное пользователем, а затем назначить это удостоверение ресурсам с правильными ролями.

Для рабочего приложения предлагается следующая роль:

Имя роли Идентификатор
Средство чтения данных индекса поиска 1407120a-92aa-4202-b7e9-c0e197c71c8f

Проверка подлинности для рабочих нагрузок в производственной среде

Используйте следующий шаблон Поиск с использованием ИИ Azure Bicep для создания ресурса и задания проверки подлинности для identityId. Bicep нуждается в идентификаторе роли. Фрагмент кода name, показанный в этом фрагменте Bicep, не является ролью Azure; она зависит от развертывания Bicep.

// main.bicep
param environment string = 'production'
param roleGuid string = ''

module aiSearchRoleUser 'core/security/role.bicep' = {
    scope: aiSearchResourceGroup
    name: 'aiSearch-role-user'
    params: {
        principalId: (environment == 'development') ? principalId : userAssignedManagedIdentity.properties.principalId 
        principalType: (environment == 'development') ? 'User' : 'ServicePrincipal'
        roleDefinitionId: roleGuid
    }
}

Файл main.bicep вызывает следующий универсальный код Bicep для создания любой роли. Вы можете создать несколько ролей RBAC, например одну для пользователя и другую для рабочей среды. Это позволяет включить как среды разработки, так и продуктивные среды в одном развертывании Bicep.

// core/security/role.bicep
metadata description = 'Creates a role assignment for an identity.'
param principalId string // passed in from main.bicep

@allowed([
    'Device'
    'ForeignGroup'
    'Group'
    'ServicePrincipal'
    'User'
])
param principalType string = 'ServicePrincipal'
param roleDefinitionId string // Role ID

resource role 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
    name: guid(subscription().id, resourceGroup().id, principalId, roleDefinitionId)
    properties: {
        principalId: principalId
        principalType: principalType
        roleDefinitionId: resourceId('Microsoft.Authorization/roleDefinitions', roleDefinitionId)
    }
}

Настройка переменных среды для производственных рабочих нагрузок

Чтобы подключиться к Поиск с использованием ИИ Azure, коду нужно указать конечную точку ресурса и идентификатор управляемой идентичности.

Создайте переменные среды для развернутого и бессерверного ресурса Поиск с использованием ИИ Azure:

  • AZURE_SEARCH_ENDPOINT. Этот URL-адрес является точкой доступа для ресурса Поиск с использованием ИИ Azure. Этот URL-адрес обычно имеет формат https://<YOUR-RESOURCE-NAME>.search.windows.net/.
  • AZURE_CLIENT_ID: это удостоверение для проверки подлинности как.

Устранение распространенных ошибок

Ошибка Причина Solution
AuthenticationFailedException Отсутствующие или недопустимые учетные данные Убедитесь, что вы вошли в систему с помощью az login интерфейса командной строки или Connect-AzAccount (PowerShell). Убедитесь, что у вашей учетной записи Azure есть доступ к подписке.
403 Forbidden Личность не имеет необходимой роли Назначьте соответствующую роль (Читатель данных индекса поиска для запросов, Соавтор данных индекса поиска для индексирования). Для распространения назначений ролей может потребоваться до 10 минут.
401 Unauthorized RBAC не включен в службе поиска Включите доступ на основе ролей на портале Azure в разделе Settings>Keys>Role-based access control.
ResourceNotFoundException Недопустимое имя конечной точки или индекса Убедитесь, что AZURE_SEARCH_ENDPOINT переменная среды соответствует URL-адресу службы поиска (формат: https://<service-name>.search.windows.net).
CredentialUnavailableException Действительные учетные данные не найдены DefaultAzureCredential пытается выполнить несколько методов проверки подлинности. Убедитесь, что настроен хотя бы один (Azure CLI, Visual Studio, переменные среды).