Dela via


Autentisera och auktorisera App Service till en vektordatabas

Den här artikeln visar hur du hanterar anslutningen mellan ditt App Service .NET-program och en vektordatabaslösning. Den omfattar användning av Microsoft Entra-hanterade identiteter för tjänster som stöds och säker lagring av anslutningssträng för andra.

Genom att lägga till en vektordatabas i ditt program kan du aktivera [semantiska minnen eller vektorlager](vektorlager) för din AI. Med Semantic Kernel SDK för .NET kan du enkelt implementera minneslagring och återkalla med hjälp av den vektordatabaslösning som du föredrar.

Förutsättningar

Använda Microsoft Entra-hanterad identitet för autentisering

Om en vektordatabastjänst stöder Microsoft Entra-autentisering kan du använda en hanterad identitet med Din App Service för säker åtkomst till vektordatabasen utan att behöva etablera eller rotera hemligheter manuellt. En lista över Azure-tjänster som stöder Microsoft Entra-autentisering finns i Azure-tjänster som stöder Microsoft Entra-autentisering.

Lägga till en hanterad identitet i App Service

Ditt program kan beviljas två typer av identiteter:

  • En systemtilldelad identitet är kopplad till ditt program och tas bort om appen tas bort. En app kan bara ha en systemtilldelad identitet.
  • En användartilldelad identitet är en fristående Azure-resurs som kan tilldelas till din app. En app kan ha flera användartilldelade identiteter.

Lägga till en systemtilldelad identitet

  1. Gå till appens sida i Azure Portal och rulla sedan ned till gruppen Inställningar.
  2. Välj Identitet.
  3. På fliken Systemtilldelat växlar du Status till och väljer sedan Spara.

az webapp identity assign Kör kommandot för att skapa en systemtilldelad identitet:

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

Lägga till en användartilldelad identitet

Om du vill lägga till en användartilldelad identitet i din app skapar du identiteten och lägger sedan till dess resursidentifierare i appkonfigurationen.

  1. Skapa en användartilldelad hanterad identitetsresurs genom att följa dessa instruktioner.

  2. I det vänstra navigeringsfönstret på appens sida rullar du ned till gruppen Inställningar .

  3. Välj Identitet.

  4. Välj Användartilldelade>Lägg till.

  5. Leta upp den identitet som du skapade tidigare, välj den och välj sedan Lägg till.

    Viktigt!

    När du har valt Lägg till startas appen om.

  1. Skapa en användartilldelad identitet:

    az identity create --resource-group <groupName> --name <identityName>
    
  2. Tilldela identiteten till din app:

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

Lägga till en Azure-roll i din hanterade identitet

  1. I Azure-portalen navigerar du till det omfång som du vill ge vektordatabasåtkomst till. Omfånget kan vara en hanteringsgrupp, prenumeration, resursgrupp eller en specifik Azure-resurs.
  2. Välj Åtkomstkontroll (IAM) i det vänstra navigeringsfönstret.
  3. Välj Lägg till och sedan Lägg till rolltilldelning.
  4. På fliken Roll väljer du den roll som ger läsbehörighet till vektordatabasen.
  5. På fliken Medlemmar väljer du den hanterade identiteten.
  6. På fliken Granska + tilldela väljer du Granska + tilldela för att tilldela rollen.

Resursomfång

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

Resursgruppsomfång

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

Prenumerationsomfång

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

Omfång för hanteringsgrupp

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

Implementera tokenbaserad autentisering med vektordatabasen

Följande kodexempel kräver följande ytterligare bibliotek:

  1. Initiera ett DefaultAzureCredential objekt för att hämta appens hanterade identitet:

    // 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. Initiera ett IMemoryStore objekt för vektordatabasen och använd det sedan för att skapa en 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. Skapa ett Kernel objekt och importera ISemanticTextMemory sedan objektet med hjälp av 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. Använd - Kernel objektet för att anropa en uppmaning som innehåller minnesåterkallelse:

    // 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}");
    

Använda Key Vault för att lagra anslutningshemligheter

Om en vektordatabas inte stöder Microsoft Entra-autentisering kan du använda ett Key Vault för att lagra dina anslutningshemligheter och hämta dem med ditt App Service-program. Genom att använda ett Key Vault för att lagra dina anslutningshemligheter kan du dela dem med flera program och styra åtkomsten till enskilda hemligheter per program.

Innan du följer dessa steg hämtar du en anslutningssträng för vektordatabasen. Se till exempel Använda Azure Cache for Redis med en ASP.NET Core-webbapp.

Lägga till en anslutningssträng i Key Vault

Viktigt!

Innan du följer de här stegen ska du se till att du har skapat ett Key Vault med hjälp av Azure-portalen.

  1. Navigera till ditt nyckelvalv i Azure-portalen.
  2. I det vänstra navigeringsfönstret i Key Vault väljer du Objekt och sedan Hemligheter.
  3. Välj + Generera/importera.
  4. På skärmen Skapa en hemlighet väljer du följande värden:
    • Uppladdningsalternativ: Manual.
    • Namn: Ange ett namn på hemligheten. Det hemliga namnet måste vara unikt i ett nyckelvalv.
    • Värde: anslutningssträng för vektordatabasen.
    • Lämna standardvärdena för de andra alternativen. Välj Skapa.
  5. När du får meddelandet att hemligheten har skapats är den redo att användas i ditt program.

Viktigt!

Innan du följer de här stegen bör du se till att du har skapat ett Key Vault med hjälp av Azure CLI.

  1. Ge ditt användarkonto behörighet till ditt nyckelvalv via rollbaserad åtkomstkontroll (RBAC), tilldela en roll med hjälp av Azure CLI-kommandot 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>"
    
  2. Lägg till anslutningssträng i Key Vault med hjälp av Azure CLI-kommandot az keyvault secret set:

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

Ge Din App Service åtkomst till Key Vault

  1. Tilldela en hanterad identitet till din App Service.
  2. Lägg till rollerna Key Vault Secrets User och Key Vault Reader i din hanterade identitet.

Implementera anslutningssträng hämtning från Key Vault

Om du vill använda följande kodexempel behöver du följande ytterligare bibliotek:

Dessa kodexempel använder en Redis-databas, men du kan tillämpa dem på alla vektordatabaser som stöder anslutningssträng.

  1. Initiera ett DefaultAzureCredential objekt för att hämta appens hanterade identitet:

    // 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. Lägg till Key Vault när du skapar konfigurationen. Detta mappar dina Key Vault-hemligheter till IConfigurationRoot objektet:

    // 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. Använd vektordatabasen anslutningssträng från Key Vault för att initiera ett IMemoryStore objekt och använd det sedan för att skapa ett 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. Skapa ett Kernel objekt och importera ISemanticTextMemory sedan objektet med hjälp av 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. Använd - Kernel objektet för att anropa en uppmaning som innehåller minnesåterkallelse:

    // 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}");
    

Använda programinställningar för att lagra anslutningshemligheter

Om en vektordatabas inte stöder Microsoft Entra-autentisering kan du använda App Service-programinställningarna för att lagra dina anslutningshemligheter. Genom att använda programinställningar kan du lagra dina anslutningshemligheter utan att etablera några ytterligare Azure-resurser.

Innan du följer dessa steg hämtar du en anslutningssträng för vektordatabasen. Se till exempel Använda Azure Cache for Redis i .NET Framework.

Lägga till en anslutningssträng i programinställningar

  1. Gå till appens sida på Azure-portalen.
  2. I appens vänstra meny väljer du Inställningar för konfigurationsprogram>.
    • Som standard döljs värden för programinställningar i portalen för säkerhet.
    • Om du vill se ett dolt värde för en programinställning väljer du dess värdefält.
  3. Välj Inställningen Ny anslutning.
  4. På skärmen Lägg till/redigera anslutningssträng väljer du följande värden:
    • Namn: Ange ett namn för inställningen. Inställningsnamnet måste vara unikt.
    • Värde: anslutningssträng för vektordatabasen.
    • Typ: Typen av anslutning, Custom om inga andra gäller.
    • Lämna standardvärdena för de andra alternativen. Välj OK.
  5. Välj Spara igen på sidan Konfiguration.

Lägg till eller redigera en appinställning med Azure CLI-kommandot az webapp config connection-string set:

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

Implementera anslutningssträng hämtning från appinställningar

Om du vill använda följande kodexempel behöver du följande ytterligare bibliotek:

Dessa kodexempel använder en Redis-databas, men du kan tillämpa dem på alla vektordatabaser som stöder anslutningssträng.

  1. Lägg till miljövariabler när du skapar konfigurationen, så mappas dina anslutningssträng till IConfigurationRoot objektet:

    // 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. Använd vektordatabasen anslutningssträng från appinställningarna för att initiera ett IMemoryStore objekt och använd det sedan för att skapa en 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. Skapa ett Kernel objekt och importera ISemanticTextMemory sedan objektet med hjälp av 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. Använd - Kernel objektet för att anropa en uppmaning som innehåller minnesåterkallelse:

    // 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}");