Skip to main content

支持 BYOK(自带密钥)的 Azure 托管标识

Copilot SDK 的 BYOK (自带密钥) 接受静态 API 密钥,但Azure部署通常使用托管标识(Microsoft Entra ID),而不是长期密钥。 由于 SDK 不原生支持 Microsoft Entra 身份验证,因此你可以通过提供程序配置字段 bearer_token 使用短期有效的持有者令牌。

本指南演示如何使用 Azure 标识 SDK 的 DefaultAzureCredential API 通过 Copilot SDK 通过 Microsoft Foundry 模型进行身份验证。

工作原理

Microsoft Foundry 的 OpenAI 兼容终结点接受来自Microsoft Entra ID的持有者令牌,以取代静态 API 密钥。 模式为:

  1. 使用 DefaultAzureCredential 获取 https://ai.azure.com/.default 作用域的令牌
  2. 将令牌作为 BYOK 提供程序配置中的 bearer_token 进行传递
  3. 在令牌过期之前刷新令牌(令牌通常有效约 1 小时)

关系图:显示描述的过程的序列图。

代码示例

先决条件

安装适用于你的语言的 Azure 标识和 Copilot SDK 软件包:

代码语言 navigation

.NET
dotnet add package GitHub.Copilot.SDK
dotnet add package Azure.Core

基本用法

使用 DefaultAzureCredential 获取令牌,并在提供程序配置中将其作为 Bearer 令牌传递:

代码语言 navigation

.NET
using Azure.Core;
using Azure.Identity;
using GitHub.Copilot;

DefaultAzureCredential credential = new(
    DefaultAzureCredential.DefaultEnvironmentVariableName);
AccessToken token = await credential.GetTokenAsync(
    new TokenRequestContext(new[] { "https://ai.azure.com/.default" }));

await using CopilotClient client = new();
string? foundryUrl = Environment.GetEnvironmentVariable("FOUNDRY_RESOURCE_URL");

await using CopilotSession session = await client.CreateSessionAsync(new SessionConfig
{
    Model = "gpt-5.5",
    Provider = new ProviderConfig
    {
        Type = "openai",
        BaseUrl = $"{foundryUrl!.TrimEnd('/')}/openai/v1/",
        BearerToken = token.Token,
        WireApi = "responses",
    },
});

AssistantMessageEvent? response = await session.SendAndWaitAsync(
    new MessageOptions { Prompt = "Hello from Managed Identity!" });
Console.WriteLine(response?.Data.Content);

长时间运行应用程序的令牌刷新

持有者令牌过期(通常在大约 1 小时后)。 对于服务器或长时间运行的代理,请在创建每个会话之前刷新令牌。 以下Python示例演示了此模式:

from azure.identity import DefaultAzureCredential
from copilot import CopilotClient
from copilot.session import PermissionHandler, ProviderConfig

SCOPE = "https://ai.azure.com/.default"

class ManagedIdentityCopilotAgent:
    """Copilot agent that refreshes Microsoft Entra tokens for Microsoft Foundry."""

    def __init__(self, foundry_url: str, model: str = "gpt-5.5"):
        self.foundry_url = foundry_url.rstrip("/")
        self.model = model
        self.credential = DefaultAzureCredential(require_envvar=True)
        self.client = CopilotClient()

    def _get_provider_config(self) -> ProviderConfig:
        """Build a ProviderConfig with a fresh bearer token."""
        token = self.credential.get_token(SCOPE).token
        return ProviderConfig(
            type="openai",
            base_url=f"{self.foundry_url}/openai/v1/",
            bearer_token=token,
            wire_api="responses",
        )

    async def chat(self, prompt: str) -> str:
        """Send a prompt and return the response text."""
        # Fresh token for each session
        session = await self.client.create_session(
            on_permission_request=PermissionHandler.approve_all,
            model=self.model,
            provider=self._get_provider_config(),
        )

        response = await session.send_and_wait(prompt)
        await session.disconnect()

        return response.data.content if response else ""

环境配置

VariableDescription示例
AZURE_TOKEN_CREDENTIALSAzure 中运行时,将其设置为 ManagedIdentityCredential.
在本地运行时,将其设置为 dev 或开发人员工具凭据名称,例如 AzureCliCredentialManagedIdentityCredential
FOUNDRY_RESOURCE_URL你的 Microsoft Foundry 资源 URLhttps://<my-resource>.openai.azure.com

不需要 API 密钥环境变量——身份验证由 DefaultAzureCredential 处理,并自动支持:

  • Managed Identity(系统分配或用户分配):适用于Azure托管的应用
  • Azure CLIaz login):用于本地开发
  • 环境变量AZURE_CLIENT_IDAZURE_TENANT_IDAZURE_CLIENT_SECRET):用于服务主体
  • 工作负荷标识:适用于 Kubernetes

请参阅 DefaultAzureCredential 文档,了解完整的凭据链:

何时使用此模式

情景Recommendation
带有托管标识的 Azure 托管应用
✅ 使用此模式
使用现有 Microsoft Entra 服务主体的应用程序
✅ 使用此模式
使用 az login 进行本地开发
✅ 使用此模式
具有静态 API 密钥的非 Azure 环境使用 BYOK (自带密钥)
GitHub Copilot订阅可用使用 GitHub OAuth 设置

另见