Delen via


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

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

  1. Navigeer naar de pagina van uw app in Azure Portal en schuif omlaag naar de groep Instellingen .
  2. Selecteer Identiteit.
  3. 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.

  1. Maak een door de gebruiker toegewezen beheerde identiteitsresource door deze instructies te volgen.

  2. Schuif in het linkernavigatiedeelvenster van de pagina van uw app omlaag naar de groep Instellingen .

  3. Selecteer Identiteit.

  4. Selecteer Gebruiker toegewezen>toevoegen.

  5. 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.

  1. Een door de gebruiker toegewezen identiteit maken:

    az identity create --resource-group <groupName> --name <identityName>
    
  2. 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

  1. 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.
  2. Selecteer toegangsbeheer (IAM) in het linkernavigatiedeelvenster.
  3. Selecteer Toevoegen en selecteer vervolgens Roltoewijzing toevoegen.
  4. Selecteer op het tabblad Rol de juiste rol die leestoegang verleent tot uw vectordatabase.
  5. Selecteer op het tabblad Leden de beheerde identiteit.
  6. 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:

  1. 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".
        }
    );
    
  2. Initialiseer een IMemoryStore object voor uw vectordatabase en gebruik het vervolgens om een 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. Bouw een Kernel object en importeer het ISemanticTextMemory 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));
    
  4. 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.

  1. Navigeer naar uw sleutelkluis in Azure Portal.
  2. Selecteer objecten in de linkernavigatiebalk van Key Vault en selecteer Vervolgens Geheimen.
  3. Selecteer + Genereren/importeren.
  4. 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.
  5. 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.

  1. 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>"
    
  2. Voeg de verbindingsreeks toe aan Key Vault met behulp van de Azure CLI-opdrachtaz keyvault secret set:

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

Uw App Service toegang verlenen tot Key Vault

  1. Wijs een beheerde identiteit toe aan uw App Service.
  2. Voeg de Key Vault Secrets User en Key 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:

Deze codevoorbeelden maken gebruik van een Redis-database, maar u kunt ze toepassen op elke vectordatabase die ondersteuning biedt voor verbindingsreeks s.

  1. 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".
        }
    );
    
  2. 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"]!;
    
  3. Gebruik uw vectordatabase verbindingsreeks uit Key Vault om een IMemoryStore object te initialiseren en gebruik het vervolgens om een 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. Bouw een Kernel object en importeer het ISemanticTextMemory 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));
    
  5. 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

  1. Navigeer naar de pagina van uw app in Azure Portal.
  2. 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.
  3. Selecteer Nieuwe verbindingsinstelling.
  4. 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.
  5. 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:

Deze codevoorbeelden maken gebruik van een Redis-database, maar u kunt ze toepassen op elke vectordatabase die ondersteuning biedt voor verbindingsreeks s.

  1. 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")!;
    
  2. Gebruik uw vectordatabase verbindingsreeks van app-instellingen om een IMemoryStore object te initialiseren en gebruik het vervolgens om een 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. Bouw een Kernel object en importeer het ISemanticTextMemory 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));
    
  4. 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}");