本指南演示如何使用 Azure 标识 SDK 的 DefaultAzureCredential API 通过 Copilot SDK 通过 Microsoft Foundry 模型进行身份验证。
工作原理
Microsoft Foundry 的 OpenAI 兼容终结点接受来自Microsoft Entra ID的持有者令牌,以取代静态 API 密钥。 模式为:
- 使用
DefaultAzureCredential获取https://ai.azure.com/.default作用域的令牌 - 将令牌作为 BYOK 提供程序配置中的
bearer_token进行传递 - 在令牌过期之前刷新令牌(令牌通常有效约 1 小时)

代码示例
先决条件
安装适用于你的语言的 Azure 标识和 Copilot SDK 软件包:
代码语言 navigation
.NET
dotnet add package GitHub.Copilot.SDK
dotnet add package Azure.Core
Python
pip install github-copilot-sdk azure-identity
TypeScript
npm install @github/copilot-sdk @azure/identity
基本用法
使用 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);
Python
import asyncio
import os
from azure.identity import DefaultAzureCredential
from copilot import CopilotClient
from copilot.session import PermissionHandler, ProviderConfig
SCOPE = "https://ai.azure.com/.default"
async def main():
# Get a token using Managed Identity, Azure CLI, or other credential chain
credential = DefaultAzureCredential(require_envvar=True)
token = credential.get_token(SCOPE).token
foundry_url = os.environ["FOUNDRY_RESOURCE_URL"]
client = CopilotClient()
await client.start()
session = await client.create_session(
on_permission_request=PermissionHandler.approve_all,
model="gpt-5.5",
provider=ProviderConfig(
type="openai",
base_url=f"{foundry_url.rstrip('/')}/openai/v1/",
bearer_token=token, # Short-lived bearer token
wire_api="responses",
),
)
response = await session.send_and_wait("Hello from Managed Identity!")
print(response.data.content)
await client.stop()
asyncio.run(main())
TypeScript
import { DefaultAzureCredential } from "@azure/identity";
import { CopilotClient } from "@github/copilot-sdk";
const credential = new DefaultAzureCredential({
requiredEnvVars: ["AZURE_TOKEN_CREDENTIALS"],
});
const tokenResponse = await credential.getToken(
"https://ai.azure.com/.default"
);
const client = new CopilotClient();
const session = await client.createSession({
model: "gpt-5.5",
provider: {
type: "openai",
baseUrl: `${process.env.FOUNDRY_RESOURCE_URL}/openai/v1/`,
bearerToken: tokenResponse.token,
wireApi: "responses",
},
});
const response = await session.sendAndWait({ prompt: "Hello!" });
console.log(response?.data.content);
await client.stop();
长时间运行应用程序的令牌刷新
持有者令牌过期(通常在大约 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 ""
环境配置
| Variable | Description | 示例 |
|---|---|---|
AZURE_TOKEN_CREDENTIALS | 在 Azure 中运行时,将其设置为 Managed. | |
在本地运行时,将其设置为 dev 或开发人员工具凭据名称,例如 Azure。 | Managed | |
FOUNDRY_RESOURCE_ | 你的 Microsoft Foundry 资源 URL | https:/ |
不需要 API 密钥环境变量——身份验证由 DefaultAzureCredential 处理,并自动支持:
- Managed Identity(系统分配或用户分配):适用于Azure托管的应用
- Azure CLI (
az login):用于本地开发 - 环境变量(
AZURE_CLIENT_ID、AZURE_TENANT_ID、AZURE_CLIENT_SECRET):用于服务主体 - 工作负荷标识:适用于 Kubernetes
请参阅 DefaultAzureCredential 文档,了解完整的凭据链:
何时使用此模式
| 情景 | Recommendation |
|---|---|
| 带有托管标识的 Azure 托管应用 | |
| ✅ 使用此模式 | |
| 使用现有 Microsoft Entra 服务主体的应用程序 | |
| ✅ 使用此模式 | |
使用 az login 进行本地开发 | |
| ✅ 使用此模式 | |
| 具有静态 API 密钥的非 Azure 环境 | 使用 BYOK (自带密钥) |
| GitHub Copilot订阅可用 | 使用 GitHub OAuth 设置 |
另见
- BYOK (自带密钥):静态 API 密钥配置
- 后端服务设置:服务器端部署
- Azure Identity 文档