在没有密钥的情况下使用 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 的详细信息,请参阅 DefaultAzureCredential 概述

使用以下方法之一设置用户分配的托管标识的客户端 ID:

  • 设置环境变量 AZURE_CLIENT_IDDefaultAzureCredential 的无参数构造函数将使用此环境变量的值(如果存在)。

    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());
    
  • DefaultAzureCredentialOptions 上设置属性 ManagedIdentityClientId

    using Azure;
    using Azure.AI.OpenAI;
    using Azure.Identity;
    using System;
    using static System.Environment;
    
    string endpoint = GetEnvironmentVariable("AZURE_OPENAI_ENDPOINT");
    
    var credential = new DefaultAzureCredential(
        new DefaultAzureCredentialOptions
        {
            ManagedIdentityClientId = "<user_assigned_client_id>"
        });
    
    OpenAIClient client = new(new Uri(endpoint), credential);
    

资源