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


Проверка подлинности и авторизация Служба приложений в векторной базе данных

В этой статье показано, как управлять подключением между приложением .NET Служба приложений и решением векторной базы данных. Он охватывает использование управляемых удостоверений Microsoft Entra для поддерживаемых служб и безопасного хранения строка подключения для других пользователей.

Добавив в приложение векторную базу данных, вы можете включить [семантические воспоминания или векторные хранилища](векторные хранилища) для искусственного интеллекта. Пакет SDK для семантического ядра для .NET позволяет легко реализовать хранилище памяти и отзыв с помощью предпочтительного решения для базы данных векторов.

Необходимые компоненты

Использование управляемого удостоверения Microsoft Entra для проверки подлинности

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

Добавление управляемого удостоверения в Служба приложений

Приложению можно предоставить два типа удостоверений:

  • Назначаемое системой удостоверение привязывается к приложению и удаляется при удалении приложения. Приложение может иметь только одно удостоверение, назначаемое системой.
  • Назначаемое пользователем удостоверение — это изолированный ресурс Azure, который можно назначить приложению. Приложение может иметь несколько назначаемых пользователем удостоверений.

Добавление назначаемого системой удостоверения

  1. Перейдите на страницу приложения в портал Azure, а затем прокрутите вниз до группы параметров.
  2. Выберите Удостоверение.
  3. На вкладке "Назначаемая системой" установите переключатель "Состояние включено", а затем нажмите кнопку "Сохранить".

Выполните команду az webapp identity assign, чтобы создать удостоверение, назначаемое системой.

az webapp identity assign --name <appName> --resource-group <groupName>

Добавление назначаемого пользователем удостоверения

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

  1. Создайте ресурс управляемого удостоверения, назначаемый пользователем, выполнив следующие инструкции.

  2. В левой области навигации страницы приложения прокрутите вниз до группы параметров .

  3. Выберите Удостоверение.

  4. Выберите "Назначаемое пользователем>" добавление.

  5. Найдите созданное ранее удостоверение, выберите его и нажмите кнопку "Добавить".

    Внимание

    После нажатия кнопки "Добавить" приложение перезапускается.

  1. Создайте назначаемое пользователем удостоверение:

    az identity create --resource-group <groupName> --name <identityName>
    
  2. Назначьте удостоверение приложению:

    az webapp identity assign --resource-group <groupName> --name <appName> --identities <identityId>
    

Добавление роли Azure в управляемое удостоверение

  1. На портале Azure перейдите к области, которой требуется предоставить доступ к векторной базе данных. Область может быть группой управления, подпиской, группой ресурсов или определенным ресурсом Azure.
  2. В области навигации слева выберите элемент управления доступом (IAM).
  3. Нажмите + Добавить и выберите Добавить назначение ролей.
  4. На вкладке "Роль" выберите соответствующую роль, которая предоставляет доступ на чтение к векторной базе данных.
  5. На вкладке "Члены" выберите управляемое удостоверение.
  6. Чтобы назначить роль, на вкладке Проверка и назначение выберите Проверка и назначение.

Область ресурсов

az role assignment create --assignee "<managedIdentityObjectID>" \
--role "<myVectorDbReaderRole>" \
--scope "/subscriptions/<subscriptionId>/resourcegroups/<resourceGroupName>/providers/<providerName>/<resourceType>/<resourceSubType>/<resourceName>"

Область группы ресурсов

az role assignment create --assignee "<managedIdentityObjectID>" \
--role "<myVectorDbReaderRole>" \
--scope "/subscriptions/<subscriptionId>/resourcegroups/<resourceGroupName>"

Область подписки

az role assignment create --assignee "<managedIdentityObjectID>" \
--role "<myVectorDbReaderRole>" \
--scope "/subscriptions/<subscriptionId>"

Область группы управления

az role assignment create --assignee "<managedIdentityObjectID>" \
--role "<myVectorDbReaderRole>" \
--scope "/providers/Microsoft.Management/managementGroups/<managementGroupName>"

Реализация проверки подлинности на основе маркеров с помощью векторной базы данных

Для следующих примеров кода требуются следующие дополнительные библиотеки:

  1. Инициализировать DefaultAzureCredential объект для получения управляемого удостоверения приложения:

    // Initialize a DefaultAzureCredential.
    // This credential type will try several authentication flows in order until one is available.
    // Will pickup Visual Studio or Azure CLI credentials in local environments.
    // Will pickup managed identity credentials in production deployments.
    TokenCredential credentials = new DefaultAzureCredential(
        new DefaultAzureCredentialOptions
        {
            // If using a user-assigned identity specify either:
            // ManagedIdentityClientId or ManagedIdentityResourceId.
            // e.g.: ManagedIdentityClientId = "myIdentityClientId".
        }
    );
    
  2. Инициализировать объект для векторной IMemoryStore базы данных, а затем использовать его для создания ISemanticTextMemory:

    // Retrieve the endpoint obtained from the Azure AI Search deployment.
    // Retrieve the endpoint and deployments obtained from the Azure OpenAI deployment.
    // Must use the deployment name not the underlying model name.
    IConfigurationRoot config = new ConfigurationBuilder().AddUserSecrets<Program>().Build();
    string searchEndpoint = config["AZURE_AISEARCH_ENDPOINT"]!;
    string openAiEndpoint = config["AZURE_OPENAI_ENDPOINT"]!;
    string embeddingModel = config["AZURE_OPENAI_EMBEDDING_NAME"]!;
    
    // The Semantic Kernel SDK provides a connector extension for Azure AI Search.
    // Initialize an AzureAISearchMemoryStore using your managed identity credentials.
    IMemoryStore memoryStore = new AzureAISearchMemoryStore(searchEndpoint, credentials);
    
    // Build a SemanticMemoryStore with Azure AI Search as the store.
    // Must also include a text embedding generation service.
    ISemanticTextMemory memory = new MemoryBuilder()
        .WithOpenAITextEmbeddingGeneration(embeddingModel, openAiEndpoint)
        .WithMemoryStore(memoryStore)
        .Build();
    
  3. Kernel Создайте объект, а затем импортируйте ISemanticTextMemory объект с помощью TextMemoryPlugin:

    // Build a Kernel, include a chat completion service.
    string chatModel = config["AZURE_OPENAI_GPT_NAME"]!;
    Kernel kernel = Kernel
        .CreateBuilder()
        .AddAzureOpenAIChatCompletion(chatModel, openAiEndpoint, credentials)
        .Build();
    
    // Import the semantic memory store as a TextMemoryPlugin.
    // The TextMemoryPlugin enable recall via prompt expressions.
    kernel.ImportPluginFromObject(new TextMemoryPlugin(memory));
    
  4. Kernel Используйте объект для вызова запроса, включающего отзыв памяти:

    // Must configure the memory collection, number of memories to recall, and relevance score.
    // The {{...}} syntax represents an expression to Semantic Kernel.
    // For more information on this syntax see:
    // https://learn.microsoft.com/semantic-kernel/prompts/prompt-template-syntax
    string memoryCollection = config["AZURE_OPENAI_MEMORY_NAME"]!;
    string? result = await kernel.InvokePromptAsync<string>(
        "{{recall 'where did I grow up?'}}",
        new()
        {
            [TextMemoryPlugin.CollectionParam] = memoryCollection,
            [TextMemoryPlugin.LimitParam] = "2",
            [TextMemoryPlugin.RelevanceParam] = "0.79",
        }
    );
    Console.WriteLine($"Output: {result}");
    

Использование Key Vault для хранения секретов подключения

Если векторная база данных не поддерживает проверку подлинности Microsoft Entra, вы можете использовать Key Vault для хранения секретов подключения и получения их с помощью приложения Служба приложений. Используя Key Vault для хранения секретов подключения, вы можете совместно использовать их с несколькими приложениями и управлять доступом к отдельным секретам для каждого приложения.

Прежде чем выполнить эти действия, получите строка подключения для векторной базы данных. Например, см. раздел "Использование Кэш Azure для Redis с веб-приложением ASP.NET Core".

Добавление строка подключения в Key Vault

Внимание

Перед выполнением этих действий убедитесь, что вы создали Key Vault с помощью портала Azure.

  1. Перейдите к хранилищу ключей на портале Azure.
  2. В области навигации key Vault слева выберите "Объекты", а затем выберите "Секреты".
  3. Выберите и создайте или импортируйте.
  4. На экране создания секрета выберите следующие значения:
    • Параметры отправки: Manual
    • Имя. Введите имя секрета. Имя секрета должно быть уникальным в пределах хранилища ключей.
    • Значение: строка подключения для векторной базы данных.
    • Оставьте другие значения по умолчанию. Нажмите кнопку создания.
  5. Когда вы получите сообщение о успешном создании секрета, оно готово к использованию в приложении.

Внимание

Перед выполнением этих действий убедитесь, что вы создали Key Vault с помощью Azure CLI.

  1. Предоставьте учетным записям пользователя разрешения для хранилища ключей с помощью контроль доступа на основе ролей (RBAC), назначьте роль с помощью команды az role assignment createAzure CLI:

    az role assignment create \
    --role "Key Vault Secrets User" \
    --assignee "<yourEmailAddress>" \
    --scope "/subscriptions/<subscriptionId>/resourceGroups/<resourceGroupName>/providers/Microsoft.KeyVault/vaults/<keyVaultName>"
    
  2. Добавьте строка подключения в Key Vault с помощью команды az keyvault secret setAzure CLI:

    az keyvault secret set \
    --vault-name "<keyVaultName>" \
    --name "<secretName>" \
    --value "<connectionString>"
    

Предоставление Служба приложений доступа к Key Vault

  1. Назначьте управляемое удостоверение Служба приложений.
  2. Добавьте роли Key Vault Secrets User в Key Vault Reader управляемое удостоверение.

Реализация извлечения строка подключения из Key Vault

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

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

  1. Инициализировать DefaultAzureCredential объект для получения управляемого удостоверения приложения:

    // Initialize a DefaultAzureCredential.
    // This credential type will try several authentication flows in order until one is available.
    // Will pickup Visual Studio or Azure CLI credentials in local environments.
    // Will pickup managed identity credentials in production deployments.
    TokenCredential credentials = new DefaultAzureCredential(
        new DefaultAzureCredentialOptions
        {
            // If using a user-assigned identity specify either:
            // ManagedIdentityClientId or ManagedIdentityResourceId.
            // e.g.: ManagedIdentityClientId = "myIdentityClientId".
        }
    );
    
  2. Добавьте Key Vault при создании конфигурации, это сопоставляет секреты Key Vault с IConfigurationRoot объектом:

    // User secrets let you provide connection strings when testing locally
    // For more info see: https://learn.microsoft.com/aspnet/core/security/app-secrets
    IConfigurationRoot config = new ConfigurationBuilder()
        .AddUserSecrets<Program>()
        .AddAzureKeyVault(new Uri("{vaultURI}"), credentials)
        .Build();
    
    // Retrieve the Redis connection string obtained from the Key Vault.
    string redisConnectionString = config["AZURE_REDIS_CONNECT_STRING"]!;
    
  3. Используйте векторную IMemoryStore базу данных строка подключения из Key Vault для инициализации объекта, а затем используйте ее для созданияISemanticTextMemory:

    // Use the connection string to connect to the database
    IDatabase database = (
        await ConnectionMultiplexer.ConnectAsync(redisConnectionString)
    ).GetDatabase();
    
    // The Semantic Kernel SDK provides a connector extension for Redis.
    // Initialize an RedisMemoryStore using your managed identity credentials.
    IMemoryStore memoryStore = new RedisMemoryStore(database);
    
    // Retrieve the endpoint and deployments obtained from the Azure OpenAI deployment.
    // Must use the deployment name not the underlying model name.
    string openAiEndpoint = config["AZURE_OPENAI_ENDPOINT"]!;
    string embeddingModel = config["AZURE_OPENAI_EMBEDDING_NAME"]!;
    
    // Build a SemanticMemoryStore with Azure AI Search as the store.
    // Must also include a text embedding generation service.
    ISemanticTextMemory memory = new MemoryBuilder()
        .WithOpenAITextEmbeddingGeneration(embeddingModel, openAiEndpoint)
        .WithMemoryStore(memoryStore)
        .Build();
    
  4. Kernel Создайте объект, а затем импортируйте ISemanticTextMemory объект с помощью TextMemoryPlugin:

    // Build a Kernel, include a chat completion service.
    string chatModel = config["AZURE_OPENAI_GPT_NAME"]!;
    Kernel kernel = Kernel
        .CreateBuilder()
        .AddAzureOpenAIChatCompletion(chatModel, openAiEndpoint, credentials)
        .Build();
    
    // Import the semantic memory store as a TextMemoryPlugin.
    // The TextMemoryPlugin enable recall via prompt expressions.
    kernel.ImportPluginFromObject(new TextMemoryPlugin(memory));
    
  5. Kernel Используйте объект для вызова запроса, включающего отзыв памяти:

    // Must configure the memory collection, number of memories to recall, and relevance score.
    // The {{...}} syntax represents an expression to Semantic Kernel.
    // For more information on this syntax see:
    // https://learn.microsoft.com/semantic-kernel/prompts/prompt-template-syntax
    string memoryCollection = config["AZURE_OPENAI_MEMORY_NAME"]!;
    string? result = await kernel.InvokePromptAsync<string>(
        "{{recall 'where did I grow up?'}}",
        new()
        {
            [TextMemoryPlugin.CollectionParam] = memoryCollection,
            [TextMemoryPlugin.LimitParam] = "2",
            [TextMemoryPlugin.RelevanceParam] = "0.79",
        }
    );
    Console.WriteLine($"Output: {result}");
    

Использование параметров приложения для хранения секретов подключения

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

Прежде чем выполнить эти действия, получите строка подключения для векторной базы данных. Например, см. раздел "Использование Кэш Azure для Redis" в платформа .NET Framework.

Добавление строка подключения в параметры приложения

  1. Перейдите на страницу приложения на портале Azure.
  2. В меню приложения слева выберите Конфигурация>Параметры приложения.
    • По умолчанию значения параметров приложения скрыты на портале для обеспечения безопасности.
    • Чтобы увидеть скрытое значение параметра приложения, выберите его поле "Значение".
  3. Выберите новый параметр подключения.
  4. На экране добавления и редактирования строка подключения выберите следующие значения:
    • Имя: введите имя параметра. Имя параметра должно быть уникальным.
    • Значение: строка подключения для векторной базы данных.
    • Тип подключения, Custom если другие не применяются.
    • Оставьте другие значения по умолчанию. Нажмите ОК.
  5. Нажмите кнопку "Сохранить обратно" на странице "Конфигурация".

Добавление или изменение параметра приложения с помощью команды az webapp config connection-string setAzure CLI:

az webapp config connection-string set \
--name "<appName>" \
--resource-group "<groupName>" \
--connection-string-type "<connectionType>" \
--settings <connectionName>='<connectionString>'

Реализация извлечения строка подключения из параметров приложения

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

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

  1. Добавьте переменные среды при сборке IConfigurationRoot конфигурации, это сопоставляет строка подключения с объектом:

    // User secrets let you provide connection strings when testing locally
    // For more info see: https://learn.microsoft.com/en-us/aspnet/core/security/app-secrets
    IConfigurationRoot config = new ConfigurationBuilder()
        .AddUserSecrets<Program>()
        .AddEnvironmentVariables()
        .Build();
    
    // Retrieve the Redis connection string obtained from the app settings.
    // The connection string name should match the entry in application settings
    string redisConnectionString = config.GetConnectionString("AZURE_REDIS")!;
    
  2. Используйте векторную базу данных строка подключения из параметров приложения для инициализации IMemoryStore объекта, а затем используйте ее для созданияISemanticTextMemory:

    // Use the connection string to connect to the database
    IDatabase database = (
        await ConnectionMultiplexer.ConnectAsync(redisConnectionString)
    ).GetDatabase();
    
    // The Semantic Kernel SDK provides a connector extension for Redis.
    // Initialize an RedisMemoryStore using your managed identity credentials.
    IMemoryStore memoryStore = new RedisMemoryStore(database);
    
    // Retrieve the endpoint and deployments obtained from the Azure OpenAI deployment.
    // Must use the deployment name not the underlying model name.
    string openAiEndpoint = config["AZURE_OPENAI_ENDPOINT"]!;
    string embeddingModel = config["AZURE_OPENAI_EMBEDDING_NAME"]!;
    
    // Build a SemanticMemoryStore with Azure AI Search as the store.
    // Must also include a text embedding generation service.
    ISemanticTextMemory memory = new MemoryBuilder()
        .WithOpenAITextEmbeddingGeneration(embeddingModel, openAiEndpoint)
        .WithMemoryStore(memoryStore)
        .Build();
    
  3. Kernel Создайте объект, а затем импортируйте ISemanticTextMemory объект с помощью TextMemoryPlugin:

    // Build a Kernel, include a chat completion service.
    string chatModel = config["AZURE_OPENAI_GPT_NAME"]!;
    Kernel kernel = Kernel
        .CreateBuilder()
        .AddAzureOpenAIChatCompletion(chatModel, openAiEndpoint, credentials)
        .Build();
    
    // Import the semantic memory store as a TextMemoryPlugin.
    // The TextMemoryPlugin enable recall via prompt expressions.
    kernel.ImportPluginFromObject(new TextMemoryPlugin(memory));
    
  4. Kernel Используйте объект для вызова запроса, включающего отзыв памяти:

    // Must configure the memory collection, number of memories to recall, and relevance score.
    // The {{...}} syntax represents an expression to Semantic Kernel.
    // For more information on this syntax see:
    // https://learn.microsoft.com/semantic-kernel/prompts/prompt-template-syntax
    string memoryCollection = config["AZURE_OPENAI_MEMORY_NAME"]!;
    string? result = await kernel.InvokePromptAsync<string>(
        "{{recall 'where did I grow up?'}}",
        new()
        {
            [TextMemoryPlugin.CollectionParam] = memoryCollection,
            [TextMemoryPlugin.LimitParam] = "2",
            [TextMemoryPlugin.RelevanceParam] = "0.79",
        }
    );
    Console.WriteLine($"Output: {result}");