使用 Microsoft Entra ID 从 Azure 托管的应用向 Azure OpenAI 进行身份验证

本文演示如何使用 Microsoft Entra ID 托管标识Microsoft.Extensions.AI 库 向 Azure OpenAI 资源验证 Azure 托管应用。

来自 Microsoft Entra ID 的托管标识允许应用轻松访问其他Microsoft受 Entra 保护的资源,例如 Azure OpenAI。 标识由 Azure 平台管理,不需要预配、管理或轮换任何机密。

先决条件

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

托管标识在 Microsoft Entra ID 中提供了一个自动托管标识,供应用程序在连接到支持 Microsoft Entra 身份验证的资源时使用。 应用程序可以使用托管标识来获取Microsoft Entra 令牌,而无需管理任何凭据。 可以为应用程序分配两种类型的标识:

  • 系统分配的标识与你的应用程序相绑定,如果删除应用,标识也会被删除。 应用只能有一个系统分配的标识。
  • 用户分配的标识是可以分配给应用的独立 Azure 资源。 应用可以有多个用户分配的标识。
  1. 导航到 Azure 门户中的应用页面,然后向下滚动到 设置 组。

  2. 选择“标识”。

  3. 在“系统分配”选项卡上,将“状态”切换为“开”,然后选择“保存”

    显示如何将系统分配的托管标识添加到应用的屏幕截图。

    注意

    前面的屏幕截图演示了 Azure 应用服务上的此过程,但步骤与其他主机(如 Azure 容器应用)类似。

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

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

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

  1. Azure 门户中,导航到想要授予 Azure OpenAI 访问权限的范围。 范围可以是 管理组订阅资源组,也可以是特定的 Azure OpenAI 资源。

  2. 在左侧导航窗格中,选择 访问控制(IAM)

  3. 选择 添加,然后选择 添加角色分配

    显示如何添加 RBAC 角色的屏幕截图。

  4. 在“角色”选项卡上,选择 认知服务 OpenAI 用户 角色。

  5. “成员”选项卡上,选择托管标识。

  6. 在“审阅 + 分配”选项卡上,选择 审阅 + 分配 来分配角色。

你可以使用 Azure CLI 在不同的范围将认知服务 OpenAI 用户角色分配给您的托管标识。

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

在应用代码中实现标识身份验证

  1. 将以下 NuGet 包添加到应用:

    dotnet add package Azure.Identity
    dotnet add package Azure.AI.OpenAI
    dotnet add package Microsoft.Extensions.Azure
    dotnet add package Microsoft.Extensions.AI
    dotnet add package Microsoft.Extensions.AI.OpenAI
    

    上述包都处理此方案的以下问题:

  2. 在应用的 Program.cs 文件中,创建一个 DefaultAzureCredential 对象来发现和配置可用的凭据:

    // For example, will discover Visual Studio or Azure CLI credentials
    // in local environments and managed identity credentials in production deployments
    var credential = new DefaultAzureCredential(
        new DefaultAzureCredentialOptions
        {
            // If necessary, specify the tenant ID,
            // user-assigned identity client or resource ID, or other options
        }
    );
    
  3. 创建 AI 服务并将其注册到服务集合:

    string endpoint = builder.Configuration["AZURE_OPENAI_ENDPOINT"];
    string deployment = builder.Configuration["AZURE_OPENAI_GPT_NAME"];
    
    builder.Services.AddChatClient(
        new AzureOpenAIClient(new Uri(endpoint), credential)
        .AsChatClient(deployment));
    
  4. 注入注册的服务以在终结点中使用:

    app.MapGet("/test-prompt", async (IChatClient chatClient) =>
    {
        return await chatClient.CompleteAsync("Test prompt", new ChatOptions());
    })
    .WithName("Test prompt");
    

    提示

    详细了解 ASP.NET 核心依赖项注入以及如何在 Azure SDK for .NET 依赖项注入 文档中注册其他 AI 服务类型。