使用英语阅读

通过


使用 .NET 进行 Azure AI 服务身份验证和授权

必须对 Azure AI 服务的应用程序请求进行身份验证。 本文介绍可用于使用 .NET 向 Azure OpenAI 和其他 AI 服务进行身份验证的选项。 这些概念适用于语义内核 SDK,以及来自特定服务(如 Azure OpenAI)的 SDK。 大多数 AI 服务会提供两种对应用和用户进行身份验证的主要方法:

  • 基于密钥的身份验证使用密钥值提供对 Azure 服务的访问权限。 这些机密值有时称为 API 密钥或访问密钥,具体取决于服务。
  • Microsoft Entra ID 提供了全面的标识和访问管理解决方案,以确保正确的标识具有对不同 Azure 资源的正确访问权限级别。

前面的部分提供了这两种方法的概念性概述,而不是详细的实现步骤。 有关连接到 Azure 服务的详细信息,请访问以下资源:

备注

本文中的示例主要侧重于与 Azure OpenAI 的连接,但相同的概念和实现步骤也适用于许多其他 Azure AI 服务。

使用密钥进行身份验证

访问密钥允许应用和工具使用服务提供的密钥向 Azure AI 服务(如 Azure OpenAI)进行身份验证。 使用 Azure 门户或 Azure CLI 等工具检索密钥,并用它来配置应用代码以连接到 AI 服务:

C#
builder.Services.AddAzureOpenAIChatCompletion(
    "deployment-model",
    "service-endpoint",
    "service-key"); // Secret key
var kernel = builder.Build();

使用密钥是一个简单的选项,但应谨慎使用此方法。 密钥不是建议的身份验证选项,因为它们:

  • 请勿遵循最低特权原则。 无论是谁使用或用于什么任务,它们都提供提升的权限。
  • 可能会意外签入源代码管理或存储在不安全的位置。
  • 可能轻松地与不应具有访问权限的参与方共享或发送给他们。
  • 通常需要手动管理和轮换。

相反,请考虑使用 Microsoft Entra ID 进行身份验证,这是对大多数方案推荐的解决方案。

使用 Microsoft Entra ID 进行身份验证

Microsoft Entra ID 是一种基于云的标识和访问管理服务,可为不同的业务和应用方案提供大量功能。 Microsoft Entra ID 是连接到 Azure OpenAI 和其他 AI 服务的建议解决方案,并提供以下优势:

  • 使用标识的无密钥身份验证。
  • 使用基于角色的访问控制 (RBAC) 为标识分配所需的最低权限。
  • 可以使用 Azure.Identity 客户端库来检测环境中不同的凭据,而无需更改代码。
  • 自动处理管理维护任务,例如轮换基础密钥。

在应用中实现Microsoft Entra 身份验证的工作流通常包括以下步骤:

  • 本地开发:

    1. 使用本地开发工具(例如 Azure CLI 或 Visual Studio)登录到 Azure。
    2. 将代码配置为使用 Azure.Identity 客户端库和 DefaultAzureCredential 类。
    3. 将 Azure 角色分配给登录帐户,以启用对 AI 服务的访问。
  • Azure 托管的应用:

    1. 将应用配置为使用 Azure.Identity 客户端库进行身份验证后,将其部署到 Azure。
    2. 托管标识分配给 Azure 托管的应用。
    3. 将 Azure 角色分配给托管标识,以启用对 AI 服务的访问权限。

以下各节将探讨此工作流的主要概念。

在本地向 Azure 进行身份验证

当从本地开发连接到 Azure AI 服务的应用时,请使用 Visual Studio 或 Azure CLI 等工具向 Azure 进行身份验证。 Azure.Identity 客户端库可以发现本地凭据,如“配置应用代码”部分中所述,用于向 Azure 服务验证应用。

例如,若要使用 Azure CLI 在本地向 Azure 进行身份验证,请运行以下命令:

Azure CLI
az login

配置应用代码

使用 Azure SDK 中的 Azure.Identity 客户端库在代码中实现 Microsoft Entra 身份验证。 Azure.Identity 库包括 DefaultAzureCredential 类,该类根据当前环境和可用的工具自动发现可用的 Azure 凭据。 请访问“适用于 .NET 的 Azure SDK:文档,获取完整的受支持环境凭据集及其搜索顺序。

例如,使用以下代码将语义内核配置为使用 DefaultAzureCredential 进行身份验证:

C#
Kernel kernel = Kernel
    .CreateBuilder()
    .AddAzureOpenAITextGeneration(
        "your-model",
        "your-endpoint",
        new DefaultAzureCredential())
    .Build();

DefaultAzureCredential 使应用能够从本地开发提升到生产环境,而无需更改代码。 例如,在开发期间,DefaultAzureCredential 会使用 Visual Studio 或 Azure CLI 中的本地用户凭据向 AI 服务进行身份验证。 将应用部署到 Azure 时,DefaultAzureCredential 会使用分配给应用的托管标识。

将角色分配给标识

Azure 基于角色的访问控制 (Azure RBAC) 是一个提供 Azure 资源的精细访问管理的系统。 将角色分配给 DefaultAzureCredential 用于连接到 Azure AI 服务的安全主体,无论其是单个用户、组、服务主体还是托管标识。 Azure 角色是一组权限集合,允许标识执行各种任务,例如生成完成或创建和删除资源。

使用 Azure CLI、Bicep 或 Azure 门户等工具将认知服务 OpenAI 用户(角色 ID:5e0bd9bd-7b93-4f28-af87-19fc36ad61bd)等角色分配给相关标识。 例如,使用 az role assignment create 命令通过 Azure CLI 分配角色:

Azure CLI
az role assignment create \
        --role "5e0bd9bd-7b93-4f28-af87-19fc36ad61bd" \
        --assignee-object-id "$PRINCIPAL_ID" \
        --scope /subscriptions/"$SUBSCRIPTION_ID"/resourceGroups/"$RESOURCE_GROUP" \
        --assignee-principal-type User

使用以下资源详细了解 Azure RBAC:

将托管标识分配给应用

在大多数情况下,Azure 托管的应用应使用托管标识连接到 Azure OpenAI 等其他服务。 托管标识在 Microsoft Entra ID 中提供了一个完全托管标识,供应用程序在连接到支持 Microsoft Entra 身份验证的资源时使用。 DefaultAzureCredential 会发现与应用关联的标识,并使用它向其他 Azure 服务进行身份验证。

可以向应用分配两种类型的托管标识:

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

像将角色分配给托管标识一样,例如认知服务 OpenAI 用户角色。 详细了解如何使用以下资源使用托管标识: