Aracılığıyla paylaş


App Service'in kimliğini doğrulama ve bir vektör veritabanında yetkilendirme

Bu makalede, App Service .NET uygulamanızla vektör veritabanı çözümü arasındaki bağlantının nasıl yönetileceğini gösterilmektedir. Desteklenen hizmetler için Microsoft Entra yönetilen kimliklerinin kullanılmasını ve bağlantı dizesi başkaları için güvenli bir şekilde depolanmasını kapsar.

Uygulamanıza bir vektör veritabanı ekleyerek yapay zekanız için [anlamsal bellekler veya vektör depoları](vektör depoları) etkinleştirebilirsiniz. .NET için Anlam Çekirdeği SDK'sı, tercih ettiğiniz vektör veritabanı çözümünü kullanarak bellek depolamayı ve geri çağırmayı kolayca uygulamanızı sağlar.

Önkoşullar

Kimlik doğrulaması için Microsoft Entra yönetilen kimliğini kullanma

Vektör veritabanı hizmeti Microsoft Entra kimlik doğrulamasını destekliyorsa, gizli dizileri el ile sağlamak veya döndürmek zorunda kalmadan vektör veritabanınıza güvenli bir şekilde erişmek için App Service'inizle birlikte yönetilen bir kimlik kullanabilirsiniz. Microsoft Entra kimlik doğrulamasını destekleyen Azure hizmetlerinin listesi için bkz . Microsoft Entra kimlik doğrulamasını destekleyen Azure hizmetleri.

App Service'e yönetilen kimlik ekleme

Uygulamanız için iki tür kimlik verilebilir:

  • Sistem tarafından atanan bir kimlik uygulamanıza bağlıdır ve uygulamanız silinirse silinir. Bir uygulama yalnızca bir sistem tarafından atanan kimliğe sahip olabilir.
  • Kullanıcı tarafından atanan kimlik ise uygulamanıza atanabilen tek başına bir Azure kaynağıdır. Bir uygulama için kullanıcı tarafından atanan birden çok kimlik olabilir.

Sistem tarafından atanan kimlik ekleme

  1. Azure portalında uygulamanızın sayfasına gidin ve ardından aşağı kaydırarak Ayarlar grubuna gidin.
  2. Kimlik öğesini seçin.
  3. Sistem tarafından atanan sekmesinde Durum seçeneğini Açık duruma getirin ve Kaydet'i seçin.

az webapp identity assign Sistem tarafından atanan bir kimlik oluşturmak için komutunu çalıştırın:

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

Kullanıcı tarafından atanan kimlik ekleme

Uygulamanıza kullanıcı tarafından atanan bir kimlik eklemek için, kimliği oluşturun ve ardından kaynak tanımlayıcısını uygulama yapılandırmanıza ekleyin.

  1. Bu yönergeleri izleyerek kullanıcı tarafından atanan bir yönetilen kimlik kaynağı oluşturun.

  2. Uygulamanızın sayfasının sol gezinti bölmesinde, aşağı kaydırarak Ayarlar grubuna gelin.

  3. Kimlik öğesini seçin.

  4. Kullanıcı tarafından atanan>Ekle'yi seçin.

  5. Daha önce oluşturduğunuz kimliği bulun, seçin ve ardından Ekle'yi seçin.

    Önemli

    Ekle'yi seçtikten sonra uygulama yeniden başlatılır.

  1. Kullanıcı tarafından atanan kimlik oluşturma:

    az identity create --resource-group <groupName> --name <identityName>
    
  2. Kimliği uygulamanıza atayın:

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

Yönetilen kimliğinize Azure rolü ekleme

  1. Azure Portal'da vektör veritabanı erişimi vermek istediğiniz kapsama gidin. Kapsam bir Yönetim grubu, Abonelik, Kaynak grubu veya belirli bir Azure kaynağı olabilir.
  2. Sol gezinti bölmesinde Erişim denetimi (IAM) öğesini seçin.
  3. Ekle'yi ve ardından Rol ataması ekle'yi seçin.
  4. Rol sekmesinde, vektör veritabanınıza okuma erişimi veren uygun rolü seçin.
  5. Üyeler sekmesinde yönetilen kimliği seçin.
  6. Gözden geçirme + atama sekmesinde Gözden geçir + ata’yı seçerek rolü atayın.

Kaynak kapsamı

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

Kaynak grubu kapsamı

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

Abonelik kapsamı

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

Yönetim grubu kapsamı

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

Vektör veritabanıyla belirteç tabanlı kimlik doğrulaması uygulama

Aşağıdaki kod örnekleri bu ek kitaplıkları gerektirir:

  1. Uygulamanızın yönetilen kimliğini almak için bir DefaultAzureCredential nesne başlatın:

    // 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. Vektör veritabanınız için bir IMemoryStore nesne başlatın ve oluşturmak için ISemanticTextMemorykullanın:

    // 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. Bir Kernel nesne oluşturun ve nesnesini kullanarak içeri aktarın 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));
    
  4. Kernel Bellek geri çağırmayı içeren bir istem çağırmak için nesnesini kullanın:

    // 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://zcusa.951200.xyz/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}");
    

Bağlantı gizli dizilerini depolamak için Key Vault kullanma

Vektör veritabanı Microsoft Entra kimlik doğrulamasını desteklemiyorsa, bağlantı gizli dizilerinizi depolamak ve App Service uygulamanızla almak için Key Vault kullanabilirsiniz. Bağlantı gizli dizilerinizi depolamak için bir Key Vault kullanarak bunları birden çok uygulamayla paylaşabilir ve uygulama başına tek tek gizli dizilere erişimi denetleyebilirsiniz.

Bu adımları uygulamadan önce vektör veritabanınız için bir bağlantı dizesi alın. Örneğin, bkz. ASP.NET Core web uygulamasıyla Redis için Azure Cache kullanma.

Key Vault'a bağlantı dizesi ekleme

Önemli

Bu adımları uygulamadan önce Azure Portal'ı kullanarak bir Key Vault oluşturduğunuzdan emin olun.

  1. Azure Portal'da anahtar kasanıza gidin.
  2. Key Vault sol gezinti bölmesinde Nesneler'i ve ardından Gizli Diziler'i seçin.
  3. + Oluştur/İçeri Aktar'ı seçin.
  4. Gizli dizi oluştur ekranında aşağıdaki değerleri seçin:
    • Karşıya yükleme seçenekleri: Manual.
    • Ad: Gizli dizi için bir ad yazın. Gizli dizi adı, aynı Anahtar Kasası içinde benzersiz bir ad olmalıdır.
    • Değer: Vektör veritabanınızın bağlantı dizesi.
    • Diğer değerleri varsayılan değerlerinde bırakın. Oluştur'u belirleyin.
  5. Gizli dizinin başarıyla oluşturulduğunu belirten iletiyi aldığınızda, uygulamanızda kullanıma hazır olur.

Önemli

Bu adımları uygulamadan önce Azure CLI kullanarak bir Key Vault oluşturduğunuzdan emin olun.

  1. Rol Tabanlı Erişim Denetimi (RBAC) aracılığıyla anahtar kasanıza kullanıcı hesabı izinleri verin, Azure CLI komutunu az role assignment createkullanarak bir rol atayın:

    az role assignment create \
    --role "Key Vault Secrets User" \
    --assignee "<yourEmailAddress>" \
    --scope "/subscriptions/<subscriptionId>/resourceGroups/<resourceGroupName>/providers/Microsoft.KeyVault/vaults/<keyVaultName>"
    
  2. Azure CLI komutunu az keyvault secret setkullanarak bağlantı dizesi Key Vault'a ekleyin:

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

App Service'inize Key Vault erişimi verme

  1. App Service'inize yönetilen kimlik atayın.
  2. Key Vault Secrets User yönetilen kimliğinize ve Key Vault Reader rollerini ekleyin.

Key Vault'tan bağlantı dizesi alma uygulama

Aşağıdaki kod örneklerini kullanmak için bu ek kitaplıklara ihtiyacınız vardır:

Bu kod örnekleri bir Redis veritabanı kullanır, ancak bunları bağlantı dizesi destekleyen herhangi bir vektör veritabanına uygulayabilirsiniz.

  1. Uygulamanızın yönetilen kimliğini almak için bir DefaultAzureCredential nesne başlatın:

    // 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. Yapılandırmanızı oluştururken Key Vault'un eklenmesi, Key Vault gizli dizilerinizi nesneyle eşler IConfigurationRoot :

    // User secrets let you provide connection strings when testing locally
    // For more info see: https://zcusa.951200.xyz/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. Bir nesneyi başlatmak IMemoryStore için Key Vault'tan bağlantı dizesi vektör veritabanınızı kullanın ve sonra bunu kullanarak bir ISemanticTextMemoryoluşturun:

    // 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. Bir Kernel nesne oluşturun ve nesnesini kullanarak içeri aktarın 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));
    
  5. Kernel Bellek geri çağırmayı içeren bir istem çağırmak için nesnesini kullanın:

    // 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://zcusa.951200.xyz/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}");
    

Bağlantı gizli dizilerini depolamak için uygulama ayarlarını kullanma

Vektör veritabanı Microsoft Entra kimlik doğrulamasını desteklemiyorsa, bağlantı gizli dizilerinizi depolamak için App Service uygulama ayarlarını kullanabilirsiniz. Uygulama ayarlarını kullanarak ek Azure kaynakları sağlamadan bağlantı gizli dizilerinizi depolayabilirsiniz.

Bu adımları uygulamadan önce vektör veritabanınız için bir bağlantı dizesi alın. Örneğin, bkz. .NET Framework'te Redis için Azure Cache kullanma.

Uygulama ayarlarına bağlantı dizesi ekleme

  1. Azure Portal'da uygulamanızın sayfasına gidin.
  2. Uygulamanın sol menüsünde Yapılandırma>Uygulaması ayarları'nı seçin.
    • Varsayılan olarak, uygulama ayarlarına yönelik değerler güvenlik için portalda gizlenir.
    • Bir uygulama ayarının gizli değerini görmek için Değer alanını seçin.
  3. Yeni bağlantı ayarı'nı seçin.
  4. Ekle/Düzenle bağlantı dizesi ekranında aşağıdaki değerleri seçin:
    • Ad: Ayar için bir ad yazın. Ayar adı benzersiz olmalıdır.
    • Değer: Vektör veritabanınızın bağlantı dizesi.
    • Tür: Başka hiçbir bağlantı uygulanmazsa bağlantı Custom türü.
    • Diğer değerleri varsayılan değerlerinde bırakın. Tamam'ı seçin.
  5. Yapılandırma sayfasında Yeniden kaydet'i seçin.

Azure CLI komutuyla az webapp config connection-string setbir uygulama ayarı ekleyin veya düzenleyin:

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

Uygulama ayarlarından bağlantı dizesi alma uygulama

Aşağıdaki kod örneklerini kullanmak için bu ek kitaplıklara ihtiyacınız vardır:

Bu kod örnekleri bir Redis veritabanı kullanır, ancak bunları bağlantı dizesi destekleyen herhangi bir vektör veritabanına uygulayabilirsiniz.

  1. Yapılandırmanızı oluştururken ortam değişkenleri eklediğinizde bağlantı dizesi nesneyle eşlenirIConfigurationRoot:

    // User secrets let you provide connection strings when testing locally
    // For more info see: https://zcusa.951200.xyz/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. Nesne başlatmak IMemoryStore için uygulama ayarlarından bağlantı dizesi vektör veritabanınızı kullanın ve ardından oluşturmak için ISemanticTextMemorykullanın:

    // 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. Bir Kernel nesne oluşturun ve nesnesini kullanarak içeri aktarın 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));
    
  4. Kernel Bellek geri çağırmayı içeren bir istem çağırmak için nesnesini kullanın:

    // 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://zcusa.951200.xyz/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}");