App Service verifiëren en autoriseren voor een vectordatabase
In dit artikel wordt beschreven hoe u de verbinding tussen uw App Service .NET-toepassing en een vectordatabaseoplossing beheert. Het omvat het gebruik van door Microsoft Entra beheerde identiteiten voor ondersteunde services en het veilig opslaan van verbindingsreeks s voor anderen.
Door een vectordatabase toe te voegen aan uw toepassing, kunt u [semantische herinneringen of vectorarchieven](vectorarchieven) inschakelen voor uw AI. Met de Semantic Kernel SDK voor .NET kunt u eenvoudig geheugenopslag implementeren en intrekken met behulp van uw favoriete vectordatabaseoplossing.
Vereisten
- Een Azure-account met een actief abonnement. Gratis een account maken
- .NET SDK
Microsoft.SemanticKernel
NuGet-pakketMicrosoft.SemanticKernel.Plugins.Memory
NuGet-pakket- Een .NET-toepassing maken en implementeren in App Service
- Een vectordatabaseoplossing maken en implementeren
Beheerde Identiteit van Microsoft Entra gebruiken voor verificatie
Als een vectordatabaseservice Microsoft Entra-verificatie ondersteunt, kunt u een beheerde identiteit met uw App Service gebruiken om veilig toegang te krijgen tot uw vectordatabase zonder dat u geheimen handmatig hoeft in te richten of te roteren. Zie Azure-services die Ondersteuning bieden voor Microsoft Entra-verificatie voor een lijst met Azure-services die Ondersteuning bieden voor Microsoft Entra-verificatie.
Een beheerde identiteit toevoegen aan App Service
Aan uw toepassing kunnen twee typen identiteiten worden toegekend:
- Een door het systeem toegewezen identiteit is gekoppeld aan uw toepassing en wordt verwijderd als uw app wordt verwijderd. Een app kan slechts één door het systeem toegewezen identiteit hebben.
- Een door de gebruiker toegewezen identiteit is een autonome Azure-resource die kan worden toegewezen aan uw app. Een app kan meerdere door de gebruiker toegewezen identiteiten hebben.
Een door het systeem toegewezen identiteit toevoegen
- Navigeer naar de pagina van uw app in Azure Portal en schuif omlaag naar de groep Instellingen .
- Selecteer Identiteit.
- Schakel op het tabblad Systeem toegewezen status in op Aan en selecteer Opslaan.
Voer de az webapp identity assign
opdracht uit om een door het systeem toegewezen identiteit te maken:
az webapp identity assign --name <appName> --resource-group <groupName>
Een door de gebruiker toegewezen identiteit toevoegen
Als u een door de gebruiker toegewezen identiteit aan uw app wilt toevoegen, maakt u de identiteit en voegt u vervolgens de resource-id toe aan uw app-configuratie.
Maak een door de gebruiker toegewezen beheerde identiteitsresource door deze instructies te volgen.
Schuif in het linkernavigatiedeelvenster van de pagina van uw app omlaag naar de groep Instellingen .
Selecteer Identiteit.
Selecteer Gebruiker toegewezen>toevoegen.
Zoek de identiteit die u eerder hebt gemaakt, selecteer deze en selecteer vervolgens Toevoegen.
Belangrijk
Nadat u Toevoegen hebt geselecteerd, wordt de app opnieuw opgestart.
Een door de gebruiker toegewezen identiteit maken:
az identity create --resource-group <groupName> --name <identityName>
Wijs de identiteit toe aan uw app:
az webapp identity assign --resource-group <groupName> --name <appName> --identities <identityId>
Een Azure-rol toevoegen aan uw beheerde identiteit
- Navigeer in Azure Portal naar het bereik waartoe u vectordatabasetoegang wilt verlenen. Het bereik kan een beheergroep, abonnement, resourcegroep of een specifieke Azure-resource zijn.
- Selecteer toegangsbeheer (IAM) in het linkernavigatiedeelvenster.
- Selecteer Toevoegen en selecteer vervolgens Roltoewijzing toevoegen.
- Selecteer op het tabblad Rol de juiste rol die leestoegang verleent tot uw vectordatabase.
- Selecteer op het tabblad Leden de beheerde identiteit.
- Selecteer op het tabblad Beoordelen en toewijzen de optie Beoordelen en toewijzen om de rol toe te wijzen.
Resourcebereik
az role assignment create --assignee "<managedIdentityObjectID>" \
--role "<myVectorDbReaderRole>" \
--scope "/subscriptions/<subscriptionId>/resourcegroups/<resourceGroupName>/providers/<providerName>/<resourceType>/<resourceSubType>/<resourceName>"
Bereik van resourcegroep
az role assignment create --assignee "<managedIdentityObjectID>" \
--role "<myVectorDbReaderRole>" \
--scope "/subscriptions/<subscriptionId>/resourcegroups/<resourceGroupName>"
Abonnementsbereik
az role assignment create --assignee "<managedIdentityObjectID>" \
--role "<myVectorDbReaderRole>" \
--scope "/subscriptions/<subscriptionId>"
Bereik van beheergroep
az role assignment create --assignee "<managedIdentityObjectID>" \
--role "<myVectorDbReaderRole>" \
--scope "/providers/Microsoft.Management/managementGroups/<managementGroupName>"
Verificatie op basis van tokens implementeren met de vectordatabase
Voor de volgende codevoorbeelden zijn deze extra bibliotheken vereist:
Initialiseer een
DefaultAzureCredential
object om de beheerde identiteit van uw app op te halen:// 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". } );
Initialiseer een
IMemoryStore
object voor uw vectordatabase en gebruik het vervolgens om eenISemanticTextMemory
:// 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();
Bouw een
Kernel
object en importeer hetISemanticTextMemory
object met behulp van: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));
Gebruik het
Kernel
object om een prompt aan te roepen die geheugen terugroept:// 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 gebruiken om verbindingsgeheimen op te slaan
Als een vectordatabase geen ondersteuning biedt voor Microsoft Entra-verificatie, kunt u een Key Vault gebruiken om uw verbindingsgeheimen op te slaan en op te halen met uw App Service-toepassing. Door een Key Vault te gebruiken om uw verbindingsgeheimen op te slaan, kunt u deze delen met meerdere toepassingen en de toegang tot afzonderlijke geheimen per toepassing beheren.
Voordat u deze stappen volgt, haalt u een verbindingsreeks op voor uw vectordatabase. Zie Bijvoorbeeld Azure Cache voor Redis gebruiken met een ASP.NET Core-web-app.
Een verbindingsreeks toevoegen aan Key Vault
Belangrijk
Voordat u deze stappen uitvoert, moet u ervoor zorgen dat u een Key Vault hebt gemaakt met behulp van Azure Portal.
- Navigeer naar uw sleutelkluis in Azure Portal.
- Selecteer objecten in de linkernavigatiebalk van Key Vault en selecteer Vervolgens Geheimen.
- Selecteer + Genereren/importeren.
- Kies in het scherm Een geheim maken de volgende waarden:
- Uploadopties:
Manual
. - Naam: Typ een naam voor het geheim. De geheime naam moet uniek zijn binnen een Key Vault.
- Waarde: de verbindingsreeks voor uw vectordatabase.
- Houd voor de overige waarden de standaardwaarden aan. Selecteer Maken.
- Uploadopties:
- Wanneer u het bericht ontvangt dat het geheim is gemaakt, kunt u het gebruiken in uw toepassing.
Belangrijk
Voordat u deze stappen uitvoert, moet u ervoor zorgen dat u een Key Vault hebt gemaakt met behulp van de Azure CLI.
Verwijs uw gebruikersaccountmachtigingen aan uw sleutelkluis via op rollen gebaseerd toegangsbeheer (RBAC), wijs een rol toe met behulp van de Azure CLI-opdracht
az role assignment create
:az role assignment create \ --role "Key Vault Secrets User" \ --assignee "<yourEmailAddress>" \ --scope "/subscriptions/<subscriptionId>/resourceGroups/<resourceGroupName>/providers/Microsoft.KeyVault/vaults/<keyVaultName>"
Voeg de verbindingsreeks toe aan Key Vault met behulp van de Azure CLI-opdracht
az keyvault secret set
:az keyvault secret set \ --vault-name "<keyVaultName>" \ --name "<secretName>" \ --value "<connectionString>"
Uw App Service toegang verlenen tot Key Vault
- Wijs een beheerde identiteit toe aan uw App Service.
- Voeg de
Key Vault Secrets User
enKey Vault Reader
rollen toe aan uw beheerde identiteit.
Verbindingsreeks ophalen vanuit Key Vault implementeren
Als u de volgende codevoorbeelden wilt gebruiken, hebt u deze aanvullende bibliotheken nodig:
Azure.Identity
NuGet-pakketAzure.Extensions.AspNetCore.Configuration.Secrets
NuGet-pakketMicrosoft.Extensions.Configuration
NuGet-pakket
Deze codevoorbeelden maken gebruik van een Redis-database, maar u kunt ze toepassen op elke vectordatabase die ondersteuning biedt voor verbindingsreeks s.
Initialiseer een
DefaultAzureCredential
object om de beheerde identiteit van uw app op te halen:// 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". } );
Voeg Key Vault toe bij het bouwen van uw configuratie. Hiermee worden uw Key Vault-geheimen toegewezen aan het
IConfigurationRoot
object:// 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"]!;
Gebruik uw vectordatabase verbindingsreeks uit Key Vault om een
IMemoryStore
object te initialiseren en gebruik het vervolgens om eenISemanticTextMemory
:// 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();
Bouw een
Kernel
object en importeer hetISemanticTextMemory
object met behulp van: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));
Gebruik het
Kernel
object om een prompt aan te roepen die geheugen terugroept:// 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}");
Toepassingsinstellingen gebruiken om verbindingsgeheimen op te slaan
Als een vectordatabase geen ondersteuning biedt voor Microsoft Entra-verificatie, kunt u de App Service-toepassingsinstellingen gebruiken om uw verbindingsgeheimen op te slaan. Met behulp van toepassingsinstellingen kunt u uw verbindingsgeheimen opslaan zonder extra Azure-resources in te richten.
Voordat u deze stappen volgt, haalt u een verbindingsreeks op voor uw vectordatabase. Zie Bijvoorbeeld Azure Cache voor Redis gebruiken in .NET Framework.
Een verbindingsreeks toevoegen aan toepassingsinstellingen
- Navigeer naar de pagina van uw app in Azure Portal.
- Selecteer in het linkermenu van de app de instellingen van de configuratietoepassing>.
- Standaard worden waarden voor toepassingsinstellingen verborgen in de portal voor beveiliging.
- Als u een verborgen waarde van een toepassingsinstelling wilt zien, selecteert u het veld Waarde.
- Selecteer Nieuwe verbindingsinstelling.
- Kies in het scherm Toevoegen/bewerken verbindingsreeks de volgende waarden:
- Naam: Typ een naam voor de instelling. De naam van de instelling moet uniek zijn.
- Waarde: de verbindingsreeks voor uw vectordatabase.
- Type: Het type verbinding,
Custom
als er geen andere zijn. - Houd voor de overige waarden de standaardwaarden aan. Selecteer OK.
- Selecteer Opslaan op de pagina Configuratie.
Een app-instelling toevoegen of bewerken met de Azure CLI-opdracht az webapp config connection-string set
:
az webapp config connection-string set \
--name "<appName>" \
--resource-group "<groupName>" \
--connection-string-type "<connectionType>" \
--settings <connectionName>='<connectionString>'
Het ophalen van verbindingsreeks implementeren vanuit app-instellingen
Als u de volgende codevoorbeelden wilt gebruiken, hebt u deze aanvullende bibliotheken nodig:
Microsoft.Extensions.Configuration
NuGet-pakketMicrosoft.Extensions.Configuration.EnvironmentVariables
NuGet-pakket
Deze codevoorbeelden maken gebruik van een Redis-database, maar u kunt ze toepassen op elke vectordatabase die ondersteuning biedt voor verbindingsreeks s.
Voeg omgevingsvariabelen toe bij het bouwen van uw configuratie. Hiermee worden uw verbindingsreeks s toegewezen aan het
IConfigurationRoot
object:// 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")!;
Gebruik uw vectordatabase verbindingsreeks van app-instellingen om een
IMemoryStore
object te initialiseren en gebruik het vervolgens om eenISemanticTextMemory
:// 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();
Bouw een
Kernel
object en importeer hetISemanticTextMemory
object met behulp van: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));
Gebruik het
Kernel
object om een prompt aan te roepen die geheugen terugroept:// 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}");
Gerelateerde inhoud
- [Redis gebruiken voor geheugenopslag met de Semantische Kernel SDK]
- Beheerde identiteiten gebruiken voor App Service en Azure Functions
- Stappen voor het toewijzen van een Azure-rol