使用 Microsoft Entra 和语义内核 SDK 向 Azure OpenAI 验证和授权应用服务

本文演示如何使用 Microsoft Entra 托管标识向 Azure OpenAI 资源验证和授权应用服务应用程序。

本文还演示如何使用语义内核 SDK 在 .NET 应用程序中轻松实现 Microsoft Entra 身份验证。

通过使用 Microsoft Entra 中的托管标识,应用服务应用程序可以轻松访问受保护的 Azure OpenAI 资源,而无需手动预配或轮换任何机密。

先决条件

将托管标识添加到应用服务

你的应用程序可以被授予两种类型的标识:

  • 系统分配的标识与你的应用程序相绑定,如果删除应用,标识也会被删除。 应用只能有一个系统分配的标识。
  • 用户分配的标识是可以分配给应用的独立 Azure 资源。 一个应用可以具有多个用户分配的标识。

添加系统分配的标识

  1. 导航到 Azure 门户中的应用页面,然后向下滚动到“设置”组。
  2. 选择“标识”。
  3. 在“系统分配”选项卡上,将“状态”切换为“打开”,然后选择“保存”

运行 az webapp identity assign 命令以创建系统分配标识:

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

添加用户分配的标识

若要将用户分配的标识添加到应用,请创建标识,然后将其资源标识符添加到应用配置。

  1. 按照这些说明创建用户分配的托管标识资源。

  2. 在应用页面的左侧导航窗格中,向下滚动到“设置”组。

  3. 选择“标识”。

  4. 选择“用户分配的>添加”。

  5. 找到之前创建的标识,将其选中,然后选择“添加”。

    重要

    选择“添加”后,应用将重启。

  1. 创建用户分配的标识:

    az identity create --resource-group <groupName> --name <identityName>
    
  2. 将标识分配给应用:

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

将 Azure OpenAI 用户角色添加到托管标识

  1. Azure 门户中,导航到要授予 Azure OpenAI 访问权限的范围。 范围可以是“管理组”、“订阅”、“资源组”或特定的 Azure OpenAI 资源
  2. 在左侧导航栏中,选择“访问控制(IAM)”
  3. 依次选择“+ 添加”和“添加角色分配” 。
  4. 在“角色”选项卡上,选择“认知服务 OpenAI 用户”角色。
  5. “成员”选项卡上,选择托管标识。
  6. 在“查看 + 分配”选项卡上,选择“查看 + 分配”,以分配角色 。

资源范围

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 实现基于令牌的身份验证

  1. 初始化 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".
        }
    );
    
  2. 生成包含 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();
    
  3. 使用 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.
    // ...