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
- Etkin aboneliği olan bir Azure hesabı. Ücretsiz hesap oluşturun.
- .NET SDK
Microsoft.SemanticKernel
NuGet paketiMicrosoft.SemanticKernel.Plugins.Memory
NuGet paketi- .NET uygulaması oluşturma ve App Service'e dağıtma
- Vektör veritabanı çözümü oluşturma ve dağıtma
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
- Azure portalında uygulamanızın sayfasına gidin ve ardından aşağı kaydırarak Ayarlar grubuna gidin.
- Kimlik öğesini seçin.
- 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.
Bu yönergeleri izleyerek kullanıcı tarafından atanan bir yönetilen kimlik kaynağı oluşturun.
Uygulamanızın sayfasının sol gezinti bölmesinde, aşağı kaydırarak Ayarlar grubuna gelin.
Kimlik öğesini seçin.
Kullanıcı tarafından atanan>Ekle'yi seçin.
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.
Kullanıcı tarafından atanan kimlik oluşturma:
az identity create --resource-group <groupName> --name <identityName>
Kimliği uygulamanıza atayın:
az webapp identity assign --resource-group <groupName> --name <appName> --identities <identityId>
Yönetilen kimliğinize Azure rolü ekleme
- 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.
- Sol gezinti bölmesinde Erişim denetimi (IAM) öğesini seçin.
- Ekle'yi ve ardından Rol ataması ekle'yi seçin.
- Rol sekmesinde, vektör veritabanınıza okuma erişimi veren uygun rolü seçin.
- Üyeler sekmesinde yönetilen kimliği seçin.
- 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:
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". } );
Vektör veritabanınız için bir
IMemoryStore
nesne başlatın ve oluşturmak içinISemanticTextMemory
kullanı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();
Bir
Kernel
nesne oluşturun ve nesnesini kullanarak içeri aktarınISemanticTextMemory
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));
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.
- Azure Portal'da anahtar kasanıza gidin.
- Key Vault sol gezinti bölmesinde Nesneler'i ve ardından Gizli Diziler'i seçin.
- + Oluştur/İçeri Aktar'ı seçin.
- 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.
- Karşıya yükleme seçenekleri:
- 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.
Rol Tabanlı Erişim Denetimi (RBAC) aracılığıyla anahtar kasanıza kullanıcı hesabı izinleri verin, Azure CLI komutunu
az role assignment create
kullanarak 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>"
Azure CLI komutunu
az keyvault secret set
kullanarak 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
- App Service'inize yönetilen kimlik atayın.
Key Vault Secrets User
yönetilen kimliğinize veKey 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:
Azure.Identity
NuGet paketiAzure.Extensions.AspNetCore.Configuration.Secrets
NuGet paketiMicrosoft.Extensions.Configuration
NuGet paketi
Bu kod örnekleri bir Redis veritabanı kullanır, ancak bunları bağlantı dizesi destekleyen herhangi bir vektör veritabanına uygulayabilirsiniz.
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". } );
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"]!;
Bir nesneyi başlatmak
IMemoryStore
için Key Vault'tan bağlantı dizesi vektör veritabanınızı kullanın ve sonra bunu kullanarak birISemanticTextMemory
oluş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();
Bir
Kernel
nesne oluşturun ve nesnesini kullanarak içeri aktarınISemanticTextMemory
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));
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
- Azure Portal'da uygulamanızın sayfasına gidin.
- 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.
- Yeni bağlantı ayarı'nı seçin.
- 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.
- Yapılandırma sayfasında Yeniden kaydet'i seçin.
Azure CLI komutuyla az webapp config connection-string set
bir 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:
Microsoft.Extensions.Configuration
NuGet paketiMicrosoft.Extensions.Configuration.EnvironmentVariables
NuGet paketi
Bu kod örnekleri bir Redis veritabanı kullanır, ancak bunları bağlantı dizesi destekleyen herhangi bir vektör veritabanına uygulayabilirsiniz.
Yapılandırmanızı oluştururken ortam değişkenleri eklediğinizde bağlantı dizesi nesneyle eşlenir
IConfigurationRoot
:// 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")!;
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çinISemanticTextMemory
kullanı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();
Bir
Kernel
nesne oluşturun ve nesnesini kullanarak içeri aktarınISemanticTextMemory
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));
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}");
İlgili içerik
- [Anlam Çekirdeği SDK'sı ile bellek depolaması için Redis kullanma]
- App Service ve Azure İşlevleri için yönetilen kimlikleri kullanma
- Azure rolü atama adımları