Az App Service hitelesítése és engedélyezése vektoradatbázis számára
Ez a cikk bemutatja, hogyan kezelheti az App Service .NET-alkalmazás és egy vektoradatbázis-megoldás közötti kapcsolatot. Ez magában foglalja a Microsoft Entra által felügyelt identitások támogatott szolgáltatásokhoz való használatát, valamint a kapcsolati sztring biztonságos tárolását mások számára.
Ha vektoradatbázist ad hozzá az alkalmazáshoz, engedélyezheti a [szemantikai emlékeket vagy vektortárolókat](vektortárolókat) az AI-hez. A Szemantic Kernel SDK for .NET lehetővé teszi a memória tárolásának és visszahívásának egyszerű megvalósítását az előnyben részesített vektoradatbázis-megoldással.
Előfeltételek
- Egy Azure-fiók, aktív előfizetéssel. Fiók ingyenes létrehozása.
- .NET SDK
Microsoft.SemanticKernel
NuGet-csomagMicrosoft.SemanticKernel.Plugins.Memory
NuGet-csomag- .NET-alkalmazás létrehozása és üzembe helyezése az App Service-ben
- Vektoradatbázis-megoldás létrehozása és üzembe helyezése
A Microsoft Entra által felügyelt identitás használata hitelesítéshez
Ha egy vektoradatbázis-szolgáltatás támogatja a Microsoft Entra-hitelesítést, az App Service-vel felügyelt identitással biztonságosan hozzáférhet a vektoradatbázishoz anélkül, hogy manuálisan kellene kiépítenie vagy elforgatnia a titkos kulcsokat. A Microsoft Entra-hitelesítést támogató Azure-szolgáltatások listáját a Microsoft Entra-hitelesítést támogató Azure-szolgáltatásokban találja.
Felügyelt identitás hozzáadása az App Service-hez
Az alkalmazás számára kétféle identitástípust lehet megadni:
- A rendszer által hozzárendelt identitás az alkalmazáshoz kötött, és adott esetben azzal együtt törlődik. Egy alkalmazás csak egy rendszer által hozzárendelt identitással rendelkezhet.
- A felhasználó által hozzárendelt identitás különálló Azure-erőforrás, amely hozzárendelhető az alkalmazáshoz. Egy alkalmazás több felhasználó által hozzárendelt identitással is rendelkezhet.
Rendszer által hozzárendelt identitás hozzáadása
- Lépjen az alkalmazás lapjára az Azure Portalon, majd görgessen le a Beállítások csoporthoz.
- Válassza ki az Identitás elemet.
- A Rendszerhez rendelt lapon állítsa be az Állapot beállítást Be állásba, majd válassza a Mentés lehetőséget.
Futtassa a az webapp identity assign
parancsot egy rendszer által hozzárendelt identitás létrehozásához:
az webapp identity assign --name <appName> --resource-group <groupName>
Felhasználó által hozzárendelt identitás hozzáadása
Ha felhasználó által hozzárendelt identitást szeretne hozzáadni az alkalmazáshoz, hozza létre az identitást, majd adja hozzá az erőforrás-azonosítóját az alkalmazáskonfigurációhoz.
Hozzon létre egy felhasználó által hozzárendelt felügyelt identitáserőforrást az alábbi utasítások követésével.
Az alkalmazás oldalának bal oldali navigációs paneljén görgessen le a Beállítások csoporthoz.
Válassza ki az Identitás elemet.
Válassza a Felhasználó által hozzárendelt>Hozzáadás lehetőséget.
Keresse meg a korábban létrehozott identitást, jelölje ki, majd válassza a Hozzáadás lehetőséget.
Fontos
A Hozzáadás lehetőség kiválasztása után az alkalmazás újraindul.
Felhasználó által hozzárendelt identitás létrehozása:
az identity create --resource-group <groupName> --name <identityName>
Rendelje hozzá az identitást az alkalmazáshoz:
az webapp identity assign --resource-group <groupName> --name <appName> --identities <identityId>
Azure-szerepkör hozzáadása a felügyelt identitáshoz
- Az Azure Portalon lépjen arra a hatókörre, amelyhez vektoradatbázis-hozzáférést szeretne biztosítani. A hatókör lehet felügyeleti csoport, előfizetés, erőforráscsoport vagy egy adott Azure-erőforrás.
- A bal oldali navigációs panelen válassza a Hozzáférés-vezérlés (IAM) lehetőséget.
- Válassza a Hozzáadás, majd a Szerepkör-hozzárendelés hozzáadása lehetőséget.
- A Szerepkör lapon válassza ki a megfelelő szerepkört, amely olvasási hozzáférést biztosít a vektoradatbázishoz.
- A Tagok lapon válassza ki a felügyelt identitást.
- A szerepkör hozzárendeléséhez a Felülvizsgálat + hozzárendelés lapon válassza a Felülvizsgálat + hozzárendelés lehetőséget.
Erőforrás hatóköre
az role assignment create --assignee "<managedIdentityObjectID>" \
--role "<myVectorDbReaderRole>" \
--scope "/subscriptions/<subscriptionId>/resourcegroups/<resourceGroupName>/providers/<providerName>/<resourceType>/<resourceSubType>/<resourceName>"
Erőforráscsoport hatóköre
az role assignment create --assignee "<managedIdentityObjectID>" \
--role "<myVectorDbReaderRole>" \
--scope "/subscriptions/<subscriptionId>/resourcegroups/<resourceGroupName>"
Előfizetés hatóköre
az role assignment create --assignee "<managedIdentityObjectID>" \
--role "<myVectorDbReaderRole>" \
--scope "/subscriptions/<subscriptionId>"
Felügyeleti csoport hatóköre
az role assignment create --assignee "<managedIdentityObjectID>" \
--role "<myVectorDbReaderRole>" \
--scope "/providers/Microsoft.Management/managementGroups/<managementGroupName>"
Jogkivonatalapú hitelesítés implementálása a vektoradatbázissal
A következő kódmintákhoz további kódtárak szükségesek:
Objektum inicializálása
DefaultAzureCredential
az alkalmazás felügyelt identitásának felvételéhez:// 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". } );
Inicializáljon egy
IMemoryStore
objektumot a vektoradatbázishoz, majd használja egyISemanticTextMemory
:// 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();
Hozzon létre egy
Kernel
objektumot, majd importálja az objektumot aISemanticTextMemory
TextMemoryPlugin
következővel:// 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
Az objektum használatával meghívhat egy memóriavisszahívást tartalmazó kérést:// 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}");
Kapcsolati titkos kulcsok tárolása a Key Vault használatával
Ha egy vektoradatbázis nem támogatja a Microsoft Entra-hitelesítést, a Key Vault használatával tárolhatja a kapcsolat titkos kulcsait, és lekérheti őket az App Service-alkalmazással. A Key Vault használatával a kapcsolati titkos kulcsokat több alkalmazással is megoszthatja, és alkalmazásonként szabályozhatja az egyes titkos kódokhoz való hozzáférést.
A lépések végrehajtása előtt kérjen le egy kapcsolati sztring a vektoradatbázishoz. Lásd például az Azure Cache for Redis használatát egy ASP.NET Core-webalkalmazással.
Kapcsolati sztring hozzáadása a Key Vaulthoz
Fontos
A lépések végrehajtása előtt győződjön meg arról, hogy létrehozott egy Key Vaultot az Azure Portal használatával.
- Lépjen a kulcstartóra az Azure Portalon.
- A Key Vault bal oldali navigációs sávjában válassza az Objektumok, majd a Titkos kulcsok lehetőséget.
- Válassza a + Létrehozás/Importálás lehetőséget.
- A Titkos kód létrehozása képernyőn válassza a következő értékeket:
- Feltöltési lehetőségek:
Manual
. - Név: Írja be a titkos kulcs nevét. A titkos kulcs nevének egyedinek kell lennie a Key Vaultban.
- Érték: A vektoradatbázis kapcsolati sztring.
- A többi értéket hagyja az alapértelmezett értéken. Válassza a Létrehozás lehetőséget.
- Feltöltési lehetőségek:
- Amikor megkapja azt az üzenetet, hogy a titkos kód sikeresen létrejött, készen áll a használatra az alkalmazásban.
Fontos
A lépések végrehajtása előtt győződjön meg arról, hogy létrehozott egy Key Vaultot az Azure CLI használatával.
Adjon felhasználói fiókengedélyeket a kulcstartóhoz szerepköralapú hozzáférés-vezérléssel (RBAC), rendeljen hozzá egy szerepkört az Azure CLI paranccsal
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>"
Adja hozzá a kapcsolati sztring a Key Vaulthoz az Azure CLI paranccsal
az keyvault secret set
:az keyvault secret set \ --vault-name "<keyVaultName>" \ --name "<secretName>" \ --value "<connectionString>"
Az App Service-nek hozzáférés biztosítása a Key Vaulthoz
- Hozzárendelhet egy felügyelt identitást az App Service-hez.
- Adja hozzá a
Key Vault Secrets User
szerepköröket aKey Vault Reader
felügyelt identitáshoz.
Kapcsolati sztring lekérés implementálása a Key Vaultból
A következő kódminták használatához további kódtárakra van szükség:
Azure.Identity
NuGet-csomagAzure.Extensions.AspNetCore.Configuration.Secrets
NuGet-csomagMicrosoft.Extensions.Configuration
NuGet-csomag
Ezek a kódminták Egy Redis-adatbázist használnak, de bármely olyan vektoradatbázisra alkalmazhatja őket, amely támogatja a kapcsolati sztring.
Objektum inicializálása
DefaultAzureCredential
az alkalmazás felügyelt identitásának felvételéhez:// 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". } );
A Konfiguráció létrehozásakor adja hozzá a Key Vaultot, ezzel leképezi a Key Vault titkos kulcsait az
IConfigurationRoot
objektumra:// 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"]!;
A Key Vaultból származó vektoradatbázis kapcsolati sztring használatával inicializálhat egy
IMemoryStore
objektumot, majd a következőtISemanticTextMemory
hozhatja létre:// 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();
Hozzon létre egy
Kernel
objektumot, majd importálja az objektumot aISemanticTextMemory
TextMemoryPlugin
következővel:// 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
Az objektum használatával meghívhat egy memóriavisszahívást tartalmazó kérést:// 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}");
Kapcsolati titkos kulcsok tárolása az alkalmazásbeállítások használatával
Ha egy vektoradatbázis nem támogatja a Microsoft Entra-hitelesítést, az App Service-alkalmazás beállításaival tárolhatja a kapcsolat titkos kulcsait. Az alkalmazásbeállítások használatával további Azure-erőforrások kiépítése nélkül tárolhatja a kapcsolat titkos kulcsait.
A lépések végrehajtása előtt kérjen le egy kapcsolati sztring a vektoradatbázishoz. Lásd például az Azure Cache for Redis használatát .NET-keretrendszer.
Kapcsolati sztring hozzáadása az alkalmazásbeállításokhoz
- Lépjen az alkalmazás lapjára az Azure Portalon.
- Az alkalmazás bal oldali menüjében válassza a Konfigurációs>alkalmazás beállításai lehetőséget.
- Alapértelmezés szerint az alkalmazásbeállítások értékei rejtettek a portálon a biztonság érdekében.
- Egy alkalmazásbeállítás rejtett értékének megtekintéséhez válassza ki annak Érték mezőjét.
- Válassza az Új kapcsolat beállítást.
- A Hozzáadás/szerkesztés kapcsolati sztring képernyőn válassza a következő értékeket:
- Név: Írja be a beállítás nevét. A beállítás nevének egyedinek kell lennie.
- Érték: A vektoradatbázis kapcsolati sztring.
- Típus: A kapcsolat típusa,
Custom
ha más nem alkalmazható. - A többi értéket hagyja az alapértelmezett értéken. Kattintson az OK gombra.
- Válassza a Vissza mentés lehetőséget a Konfiguráció lapon.
Alkalmazásbeállítás hozzáadása vagy szerkesztése az Azure CLI-paranccsal az webapp config connection-string set
:
az webapp config connection-string set \
--name "<appName>" \
--resource-group "<groupName>" \
--connection-string-type "<connectionType>" \
--settings <connectionName>='<connectionString>'
Kapcsolati sztring lekérésének implementálása az alkalmazásbeállításokból
A következő kódminták használatához további kódtárakra van szükség:
Microsoft.Extensions.Configuration
NuGet-csomagMicrosoft.Extensions.Configuration.EnvironmentVariables
NuGet-csomag
Ezek a kódminták Egy Redis-adatbázist használnak, de bármely olyan vektoradatbázisra alkalmazhatja őket, amely támogatja a kapcsolati sztring.
Környezeti változók hozzáadása a konfiguráció létrehozásakor, ez megfelelteti a kapcsolati sztring az
IConfigurationRoot
objektumnak:// 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")!;
Használja a vektoradatbázist kapcsolati sztring az alkalmazásbeállításokból egy
IMemoryStore
objektum inicializálásához, majd használja egyISemanticTextMemory
:// 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();
Hozzon létre egy
Kernel
objektumot, majd importálja az objektumot aISemanticTextMemory
TextMemoryPlugin
következővel:// 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
Az objektum használatával meghívhat egy memóriavisszahívást tartalmazó kérést:// 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}");
Kapcsolódó tartalom
- [A Redis használata memóriatároláshoz a Szemantikus Kernel SDK-val]
- Felügyelt identitások használata az App Service-hez és az Azure Functionshez
- Azure-szerepkör hozzárendelésének lépései