在没有密钥的情况下使用 Azure OpenAI

对大多数 Azure 服务的应用程序请求必须使用密钥或无密码连接进行身份验证。 开发人员必须尽量避免在不安全的位置公开密钥。 能够访问密钥的任何人都可以对服务进行身份验证。 与帐户密钥相比,无密钥身份验证具有更好的管理和安全优势,因为无需存储密钥(或连接字符串)。

通过以下步骤启用无密钥连接:

  • 配置身份验证。
  • 根据需要设置环境变量。
  • 使用 Azure 标识库凭据类型创建 Azure OpenAI 客户端对象。

身份验证

若要使用 Azure 客户端库,需要对 Microsoft Entra ID 进行身份验证。

身份验证因运行应用的环境而异:

Azure OpenAI 无键构建基块

使用以下链接浏览 Azure OpenAI 无密钥构建基块 AI 模板。 此模板使用用户帐户 RBAC 角色权限预配 Azure OpenAI 帐户,以便对无密钥(Microsoft Entra)身份验证进行访问 OpenAI API SDK。

注意

本文使用一个或多个 AI 应用模板作为本文中的示例和指南的基础。 AI 应用模板为你提供了维护良好、易于部署的参考实现,可帮助确保 AI 应用有一个高质量的起点。

对本地开发进行身份验证

对 Azure 托管的环境进行身份验证

了解如何管理部署到 Azure 的应用程序的 DefaultAzureCredential

为授权配置角色

  1. 查找使用 Azure OpenAI 的角色。 根据你打算如何设置该角色,需要名称或 ID。

    角色名称 角色 ID
    对于 Azure CLI 或 Azure PowerShell,可以使用角色名称。 对于 Bicep,需要角色 ID。
  2. 使用下表选择角色和 ID。

    用例 角色名称 角色 ID
    助手 Cognitive Services OpenAI Contributor a001fd3d-188f-4b5d-821b-7da978bf7442
    聊天完成 Cognitive Services OpenAI User 5e0bd9bd-7b93-4f28-af87-19fc36ad61bd
  3. 选择要使用的标识类型。

    • 个人标识:这是与你登录 Azure 绑定的个人标识。
    • 托管标识:这是由 Azure 管理并为在 Azure 上使用而创建的标识。 对于托管标识,创建一个用户分配的托管标识。 创建托管标识时,需要 Client ID,也称为 app ID
  4. 要查找你的个人标识,请使用以下命令之一。 在下一步中,将 ID 用作 <identity-id>

    对于本地开发,若要获取自己的标识 ID,请使用以下命令。 在使用此命令之前,需要使用 az login 登录。

    az ad signed-in-user show \
        --query id -o tsv
    
  5. 将基于角色的访问控制 (RBAC) 角色分配给资源组的标识。

    若要通过 RBAC 授予你对资源的标识权限,请使用 Azure CLI 命令 az role assignment create 分配角色。

    az role assignment create \
        --role "Cognitive Services OpenAI User" \
        --assignee "<identity-id>" \
        --scope "/subscriptions/<subscription-id>/resourceGroups/<resource-group-name>"
    

    如果适用,请将 <identity-id><subscription-id><resource-group-name> 替换为实际值。

配置环境变量

若要连接到 Azure OpenAI,代码需要知道资源终结点,并且 可能需要 其他环境变量。

  1. 为 Azure OpenAI 终结点创建环境变量。

    • AZURE_OPENAI_ENDPOINT:此 URL 是 Azure OpenAI 资源的访问点。
  2. 根据应用运行的位置创建环境变量:

    位置 标识 说明
    Local 个人 对于具有个人标识的本地运行时,请登录以使用工具创建凭据。
    Azure 云 用户分配的托管标识 创建一个 AZURE_CLIENT_ID 环境变量,其中包含要进行身份验证的用户分配托管标识的客户端 ID。

安装 Azure 标识客户端库

使用以下链接安装 Azure 标识客户端库。

安装 .NET Azure 标识客户端库

dotnet add package Azure.Identity

使用 DefaultAzureCredential

Azure 标识库的 DefaultAzureCredential 允许客户在本地开发环境和 Azure 云中运行相同的代码。

有关适用于 .NET 的 DefaultAzureCredential 的详细信息,请参阅适用于 .NET 的 Azure 标识客户端库

using Azure;
using Azure.AI.OpenAI;
using Azure.Identity;
using System;
using static System.Environment;

string endpoint = GetEnvironmentVariable("AZURE_OPENAI_ENDPOINT");

OpenAIClient client = new(new Uri(endpoint), new DefaultAzureCredential());

资源