活动
使用 .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 服务:
builder.Services.AddAzureOpenAIChatCompletion(
"deployment-model",
"service-endpoint",
"service-key"); // Secret key
var kernel = builder.Build();
使用密钥是一个简单的选项,但应谨慎使用此方法。 密钥不是建议的身份验证选项,因为它们:
- 请勿遵循最低特权原则。 无论是谁使用或用于什么任务,它们都提供提升的权限。
- 可能会意外签入源代码管理或存储在不安全的位置。
- 可能轻松地与不应具有访问权限的参与方共享或发送给他们。
- 通常需要手动管理和轮换。
相反,请考虑使用 Microsoft Entra ID 进行身份验证,这是对大多数方案推荐的解决方案。
Microsoft Entra ID 是一种基于云的标识和访问管理服务,可为不同的业务和应用方案提供大量功能。 Microsoft Entra ID 是连接到 Azure OpenAI 和其他 AI 服务的建议解决方案,并提供以下优势:
- 使用标识的无密钥身份验证。
- 使用基于角色的访问控制 (RBAC) 为标识分配所需的最低权限。
- 可以使用
Azure.Identity
客户端库来检测环境中不同的凭据,而无需更改代码。 - 自动处理管理维护任务,例如轮换基础密钥。
在应用中实现Microsoft Entra 身份验证的工作流通常包括以下步骤:
本地开发:
- 使用本地开发工具(例如 Azure CLI 或 Visual Studio)登录到 Azure。
- 将代码配置为使用
Azure.Identity
客户端库和DefaultAzureCredential
类。 - 将 Azure 角色分配给登录帐户,以启用对 AI 服务的访问。
Azure 托管的应用:
- 将应用配置为使用
Azure.Identity
客户端库进行身份验证后,将其部署到 Azure。 - 将托管标识分配给 Azure 托管的应用。
- 将 Azure 角色分配给托管标识,以启用对 AI 服务的访问权限。
- 将应用配置为使用
以下各节将探讨此工作流的主要概念。
当从本地开发连接到 Azure AI 服务的应用时,请使用 Visual Studio 或 Azure CLI 等工具向 Azure 进行身份验证。 Azure.Identity
客户端库可以发现本地凭据,如“配置应用代码”部分中所述,用于向 Azure 服务验证应用。
例如,若要使用 Azure CLI 在本地向 Azure 进行身份验证,请运行以下命令:
az login
使用 Azure SDK 中的 Azure.Identity
客户端库在代码中实现 Microsoft Entra 身份验证。 Azure.Identity
库包括 DefaultAzureCredential
类,该类根据当前环境和可用的工具自动发现可用的 Azure 凭据。 请访问“适用于 .NET 的 Azure SDK:文档,获取完整的受支持环境凭据集及其搜索顺序。
例如,使用以下代码将语义内核配置为使用 DefaultAzureCredential
进行身份验证:
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 分配角色:
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 用户角色。 详细了解如何使用以下资源使用托管标识:
其他资源
培训
模块
使用托管标识通过 .NET 向 Azure OpenAI 进行身份验证的简介 - Training
如何使用 .NET 实现对 Azure OpenAI 的基于角色的访问控制和托管标识身份验证。
认证
Microsoft Certified: Azure AI Engineer Associate - Certifications
使用 Azure AI 服务、Azure AI 搜索和 Azure Open AI 设计和实现 Azure AI 解决方案。