Проверка подлинности и авторизация Служба приложений в векторной базе данных
В этой статье показано, как управлять подключением между приложением .NET Служба приложений и решением векторной базы данных. Он охватывает использование управляемых удостоверений Microsoft Entra для поддерживаемых служб и безопасного хранения строка подключения для других пользователей.
Добавив в приложение векторную базу данных, вы можете включить [семантические воспоминания или векторные хранилища](векторные хранилища) для искусственного интеллекта. Пакет SDK для семантического ядра для .NET позволяет легко реализовать хранилище памяти и отзыв с помощью предпочтительного решения для базы данных векторов.
Необходимые компоненты
- Учетная запись Azure с активной подпиской. Создайте учетную запись бесплатно .
- Пакет SDK для .NET
Microsoft.SemanticKernel
Пакет NuGetMicrosoft.SemanticKernel.Plugins.Memory
Пакет NuGet- Создание и развертывание приложения .NET в Служба приложений
- Создание и развертывание решения для векторной базы данных
Использование управляемого удостоверения Microsoft Entra для проверки подлинности
Если служба векторной базы данных поддерживает проверку подлинности Microsoft Entra, вы можете использовать управляемое удостоверение с Служба приложений для безопасного доступа к базе данных векторов без необходимости вручную подготавливать или менять секреты. Список служб Azure, поддерживающих проверку подлинности Microsoft Entra, см . в службах Azure, поддерживающих проверку подлинности Microsoft Entra.
Добавление управляемого удостоверения в Служба приложений
Приложению можно предоставить два типа удостоверений:
- Назначаемое системой удостоверение привязывается к приложению и удаляется при удалении приложения. Приложение может иметь только одно удостоверение, назначаемое системой.
- Назначаемое пользователем удостоверение — это изолированный ресурс Azure, который можно назначить приложению. Приложение может иметь несколько назначаемых пользователем удостоверений.
Добавление назначаемого системой удостоверения
- Перейдите на страницу приложения в портал Azure, а затем прокрутите вниз до группы параметров.
- Выберите Удостоверение.
- На вкладке "Назначаемая системой" установите переключатель "Состояние включено", а затем нажмите кнопку "Сохранить".
Выполните команду az webapp identity assign
, чтобы создать удостоверение, назначаемое системой.
az webapp identity assign --name <appName> --resource-group <groupName>
Добавление назначаемого пользователем удостоверения
Чтобы добавить удостоверение, назначаемое пользователем, создайте удостоверение и добавьте его идентификатор ресурса в конфигурацию приложения.
Создайте ресурс управляемого удостоверения, назначаемый пользователем, выполнив следующие инструкции.
В левой области навигации страницы приложения прокрутите вниз до группы параметров .
Выберите Удостоверение.
Выберите "Назначаемое пользователем>" добавление.
Найдите созданное ранее удостоверение, выберите его и нажмите кнопку "Добавить".
Внимание
После нажатия кнопки "Добавить" приложение перезапускается.
Создайте назначаемое пользователем удостоверение:
az identity create --resource-group <groupName> --name <identityName>
Назначьте удостоверение приложению:
az webapp identity assign --resource-group <groupName> --name <appName> --identities <identityId>
Добавление роли Azure в управляемое удостоверение
- На портале Azure перейдите к области, которой требуется предоставить доступ к векторной базе данных. Область может быть группой управления, подпиской, группой ресурсов или определенным ресурсом Azure.
- В области навигации слева выберите элемент управления доступом (IAM).
- Нажмите + Добавить и выберите Добавить назначение ролей.
- На вкладке "Роль" выберите соответствующую роль, которая предоставляет доступ на чтение к векторной базе данных.
- На вкладке "Члены" выберите управляемое удостоверение.
- Чтобы назначить роль, на вкладке Проверка и назначение выберите Проверка и назначение.
Область ресурсов
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>"
Реализация проверки подлинности на основе маркеров с помощью векторной базы данных
Для следующих примеров кода требуются следующие дополнительные библиотеки:
Инициализировать
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". } );
Инициализировать объект для векторной
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();
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));
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.
- Перейдите к хранилищу ключей на портале Azure.
- В области навигации key Vault слева выберите "Объекты", а затем выберите "Секреты".
- Выберите и создайте или импортируйте.
- На экране создания секрета выберите следующие значения:
- Параметры отправки:
Manual
- Имя. Введите имя секрета. Имя секрета должно быть уникальным в пределах хранилища ключей.
- Значение: строка подключения для векторной базы данных.
- Оставьте другие значения по умолчанию. Нажмите кнопку создания.
- Параметры отправки:
- Когда вы получите сообщение о успешном создании секрета, оно готово к использованию в приложении.
Внимание
Перед выполнением этих действий убедитесь, что вы создали Key Vault с помощью Azure CLI.
Предоставьте учетным записям пользователя разрешения для хранилища ключей с помощью контроль доступа на основе ролей (RBAC), назначьте роль с помощью команды
az role assignment create
Azure CLI:az role assignment create \ --role "Key Vault Secrets User" \ --assignee "<yourEmailAddress>" \ --scope "/subscriptions/<subscriptionId>/resourceGroups/<resourceGroupName>/providers/Microsoft.KeyVault/vaults/<keyVaultName>"
Добавьте строка подключения в Key Vault с помощью команды
az keyvault secret set
Azure CLI:az keyvault secret set \ --vault-name "<keyVaultName>" \ --name "<secretName>" \ --value "<connectionString>"
Предоставление Служба приложений доступа к Key Vault
- Назначьте управляемое удостоверение Служба приложений.
- Добавьте роли
Key Vault Secrets User
вKey Vault Reader
управляемое удостоверение.
Реализация извлечения строка подключения из Key Vault
Чтобы использовать следующие примеры кода, вам потребуются следующие дополнительные библиотеки:
Azure.Identity
Пакет NuGetAzure.Extensions.AspNetCore.Configuration.Secrets
Пакет NuGetMicrosoft.Extensions.Configuration
Пакет NuGet
Эти примеры кода используют базу данных Redis, но их можно применить к любой векторной базе данных, поддерживающей строка подключения.
Инициализировать
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". } );
Добавьте 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"]!;
Используйте векторную
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();
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));
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.
Добавление строка подключения в параметры приложения
- Перейдите на страницу приложения на портале Azure.
- В меню приложения слева выберите Конфигурация>Параметры приложения.
- По умолчанию значения параметров приложения скрыты на портале для обеспечения безопасности.
- Чтобы увидеть скрытое значение параметра приложения, выберите его поле "Значение".
- Выберите новый параметр подключения.
- На экране добавления и редактирования строка подключения выберите следующие значения:
- Имя: введите имя параметра. Имя параметра должно быть уникальным.
- Значение: строка подключения для векторной базы данных.
- Тип подключения,
Custom
если другие не применяются. - Оставьте другие значения по умолчанию. Нажмите ОК.
- Нажмите кнопку "Сохранить обратно" на странице "Конфигурация".
Добавление или изменение параметра приложения с помощью команды az webapp config connection-string set
Azure CLI:
az webapp config connection-string set \
--name "<appName>" \
--resource-group "<groupName>" \
--connection-string-type "<connectionType>" \
--settings <connectionName>='<connectionString>'
Реализация извлечения строка подключения из параметров приложения
Чтобы использовать следующие примеры кода, вам потребуются следующие дополнительные библиотеки:
Microsoft.Extensions.Configuration
Пакет NuGetMicrosoft.Extensions.Configuration.EnvironmentVariables
Пакет NuGet
Эти примеры кода используют базу данных Redis, но их можно применить к любой векторной базе данных, поддерживающей строка подключения.
Добавьте переменные среды при сборке
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")!;
Используйте векторную базу данных строка подключения из параметров приложения для инициализации
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();
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));
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}");
Связанный контент
- [Использование Redis для хранилища памяти с пакетом SDK для семантического ядра]
- Использование управляемых удостоверений в Службе приложений и Функциях Azure
- Действия по назначению роли Azure