Skip to main content

Azure managed identity with BYOK

БЁК (принеси свой ключ) SDK Copilot принимает статические API-ключи, но развертывания Azure часто используют управляемую идентичность (Microsoft Entra ID) вместо долгоживущих ключей. Поскольку SDK нативно не поддерживает аутентификацию Microsoft Entra, вы можете использовать кратковременный носитель-токен через bearer_token поле конфигурации провайдера.

В этом руководстве показано, как использовать API Azure Identity SDK DefaultAzureCredential для аутентификации с моделями Microsoft Foundry через Copilot SDK.

Принцип работы

Совместимая с OpenAI конечная точка Microsoft Foundry принимает носительские токены из Microsoft Entra ID вместо статических API-ключей. Шаблон:

  1. Используйте DefaultAzureCredential для получения токена для https://ai.azure.com/.default области
  2. Передайте токен как bearer_token в конфигурации провайдера BYOK
  3. Обновите токен до истечения срока действия (токены обычно действительны ~1 час)

Диаграмма: диаграмма последовательностей, показывающая описанный процесс.

Примеры кода

Необходимые условия

Установите пакеты Azure Identity и Copilot SDK для вашего языка:

Языки кода navigation

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

Основное использование

Получите токен с помощью DefaultAzureCredential и передайте его как носитель в конфигурации вашего провайдера:

Языки кода 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 ""

Конфигурация среды

ПеременнаяDescriptionПример
AZURE_TOKEN_CREDENTIALSПри запуске в Azure установите на ManagedIdentityCredential. При локальном запуске установите его либо dev на имя учетных AzureCliCredentialданных инструмента разработчика, например .ManagedIdentityCredential
FOUNDRY_RESOURCE_URLВаш URL ресурса Microsoft Foundryhttps://<my-resource>.openai.azure.com

Не требуется переменная окружения ключа API — аутентификация осуществляется DefaultAzureCredentialс помощью , который автоматически поддерживает:

  • Управляемая идентичность (системно назначенная или пользовательская): для приложений, размещённых Azure
  • Azure CLI (az login): для местного развития
  • Переменные среды (AZURE_CLIENT_ID, AZURE_TENANT_ID, AZURE_CLIENT_SECRET): для принципов сервисов
  • Идентификация рабочей нагрузки: для Kubernetes

Смотрите DefaultAzureCredential документацию для полной цепочки учетных данных:

Когда следует использовать этот шаблон

ScenarioRecommendation
Azure-хостируемое приложение с управляемой идентичностью
✅ Используйте этот шаблон
Приложение с существующим принципом сервиса Microsoft Entra
✅ Используйте этот шаблон
Местное развитие с az login
✅ Используйте этот шаблон
Не-Azure среда со статическим API-ключомИспользуйте автозаголовок
Доступна подписка GitHub CopilotИспользуйте автозаголовок

См. также