使用 Microsoft Entra 和语义内核 SDK 向 Azure OpenAI 验证和授权应用服务
本文演示如何使用 Microsoft Entra 托管标识向 Azure OpenAI 资源验证和授权应用服务应用程序。
本文还演示如何使用语义内核 SDK 在 .NET 应用程序中轻松实现 Microsoft Entra 身份验证。
通过使用 Microsoft Entra 中的托管标识,应用服务应用程序可以轻松访问受保护的 Azure OpenAI 资源,而无需手动预配或轮换任何机密。
先决条件
- 具有活动订阅的 Azure 帐户。 免费创建帐户。
- .NET SDK
Microsoft.SemanticKernel
NuGet 程序包Azure.Identity
NuGet 程序包- 创建和部署 Azure OpenAI 服务资源
- 创建 .NET 应用程序并将其部署到应用服务
将托管标识添加到应用服务
你的应用程序可以被授予两种类型的标识:
- 系统分配的标识与你的应用程序相绑定,如果删除应用,标识也会被删除。 应用只能有一个系统分配的标识。
- 用户分配的标识是可以分配给应用的独立 Azure 资源。 一个应用可以具有多个用户分配的标识。
添加系统分配的标识
- 导航到 Azure 门户中的应用页面,然后向下滚动到“设置”组。
- 选择“标识”。
- 在“系统分配”选项卡上,将“状态”切换为“打开”,然后选择“保存”。
运行 az webapp identity assign
命令以创建系统分配标识:
az webapp identity assign --name <appName> --resource-group <groupName>
添加用户分配的标识
若要将用户分配的标识添加到应用,请创建标识,然后将其资源标识符添加到应用配置。
按照这些说明创建用户分配的托管标识资源。
在应用页面的左侧导航窗格中,向下滚动到“设置”组。
选择“标识”。
选择“用户分配的>添加”。
找到之前创建的标识,将其选中,然后选择“添加”。
重要
选择“添加”后,应用将重启。
创建用户分配的标识:
az identity create --resource-group <groupName> --name <identityName>
将标识分配给应用:
az webapp identity assign --resource-group <groupName> --name <appName> --identities <identityId>
将 Azure OpenAI 用户角色添加到托管标识
- 在 Azure 门户中,导航到要授予 Azure OpenAI 访问权限的范围。 范围可以是“管理组”、“订阅”、“资源组”或特定的 Azure OpenAI 资源。
- 在左侧导航栏中,选择“访问控制(IAM)”。
- 依次选择“+ 添加”和“添加角色分配” 。
- 在“角色”选项卡上,选择“认知服务 OpenAI 用户”角色。
- 在“成员”选项卡上,选择托管标识。
- 在“查看 + 分配”选项卡上,选择“查看 + 分配”,以分配角色 。
资源范围
az role assignment create --assignee "<managedIdentityObjectID>" \
--role "Cognitive Services OpenAI User" \
--scope "/subscriptions/<subscriptionId>/resourcegroups/<resourceGroupName>/providers/<providerName>/<resourceType>/<resourceSubType>/<resourceName>"
资源组范围
az role assignment create --assignee "<managedIdentityObjectID>" \
--role "Cognitive Services OpenAI User" \
--scope "/subscriptions/<subscriptionId>/resourcegroups/<resourceGroupName>"
订阅范围
az role assignment create --assignee "<managedIdentityObjectID>" \
--role "Cognitive Services OpenAI User" \
--scope "/subscriptions/<subscriptionId>"
管理组范围
az role assignment create --assignee "<managedIdentityObjectID>" \
--role "Cognitive Services OpenAI User" \
--scope "/providers/Microsoft.Management/managementGroups/<managementGroupName>"
使用语义内核 SDK 实现基于令牌的身份验证
初始化
DefaultAzureCredential
对象以假定应用的托管标识:// 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". } );
生成包含 Azure OpenAI 聊天完成服务的
Kernel
对象,并使用以前创建的凭据:// Retrieve the endpoint and deployment obtained from the Azure OpenAI deployment. // Must use the deployment name not the underlying model name. IConfigurationRoot config = new ConfigurationBuilder().AddUserSecrets<Program>().Build(); string endpoint = config["AZURE_OPENAI_ENDPOINT"]!; string deployment = config["AZURE_OPENAI_GPT_NAME"]!; // Build a Kernel that includes the Azure OpenAI Chat Completion Service. // Include the previously created token credential. Kernel kernel = Kernel .CreateBuilder() .AddAzureOpenAIChatCompletion(deployment, endpoint, credentials) .Build();
使用
Kernel
对象通过 Azure OpenAI 调用提示完成:// Use the Kernel to invoke prompt completion through Azure OpenAI. // The Kernel response will be null if the model can't be reached. string? result = await kernel.InvokePromptAsync<string>("Please list three Azure services"); Console.WriteLine($"Output: {result}"); // Continue sending and receiving messages between the user and AI. // ...