Поделиться через


Конфигурация приложения для доверия управляемому удостоверению (предварительная версия)

В этой статье описывается настройка приложения Microsoft Entra для доверия к управляемому удостоверению. Затем можно обменять токен управляемого удостоверения на токен доступа, который получает доступ к защищенным ресурсам Microsoft Entra без необходимости использования или управления секретами приложений.

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

Важные рекомендации и ограничения

Чтобы создать, обновить или удалить федеративные учетные данные, учетная запись, выполняющая действие, должна иметь роль администратора приложений , роль разработчика приложений , роль администратора облачных приложений или роль владельца приложения. Чтобы обновить федеративные удостоверения, требуется разрешение microsoft.directory/applications/credentials/update.

В приложение или управляемое удостоверение, назначаемое пользователем, можно добавить не более 20 федеративных удостоверений.

При настройке федеративных учетных данных удостоверения необходимо указать несколько важных элементов:

  • издателя и субъекта являются ключевыми фрагментами информации, необходимой для настройки отношения доверия. Сочетание issuer и subject должно быть уникальным в приложении. Когда рабочая нагрузка Azure запрашивает платформу идентификации Microsoft обменять маркер управляемого удостоверения на маркер доступа, значения федеративных учетных данных удостоверения издатель и субъект проверяются по утверждениям и , предоставленным в маркере управляемого удостоверения. Если эта проверка проходит, платформа удостоверений Майкрософт выдает маркер доступа к внешней рабочей нагрузке программного обеспечения.

  • издателя является URL-адресом URL-адреса центра клиента Microsoft Entra в форме https://login.microsoftonline.com/{tenant}/v2.0. Приложение Microsoft Entra и управляемое удостоверение должны принадлежать одному клиенту. Если заявление issuer имеет начальные или конечные пробелы в значении, обмен токена блокируется.

    Важный

    Хотя регистрация приложения и управляемое удостоверение должны находиться в одном клиенте, представитель службы регистрации приложения по-прежнему может воспользоваться токеном управляемого удостоверения.

  • subject — это GUID объекта управляемого удостоверения (Principal ID), назначенного на рабочую нагрузку Azure. Платформа удостоверений Майкрософт проверяет входящие внешние маркеры и отклоняет обмен маркером доступа, если поле субъекта, настроенное в учетных данных федеративного удостоверения, не соответствует идентификатору субъекта управляемого удостоверения. Идентификатор GUID учитывает регистр.

  • Важный

    Вы можете использовать только управляемые удостоверения User-Assigned в этом функционале.

  • *Список аудиторий: аудитории, которые могут отображаться во внешнем токене (обязательно). Необходимо добавить одно значение аудитории, которое имеет ограничение в 600 символов. Значение должно быть одним из следующих и должно соответствовать значению утверждения aud в токене управляемой идентичности.

    • общедоступного облака: api://AzureADTokenExchange
    • Fairfax: api://AzureADTokenExchangeUSGov
    • Лунный пирожок: api://AzureADTokenExchangeChina
    • USNat: api://AzureADTokenExchangeUSNat
    • USSec: api://AzureADTokenExchangeUSSec

    Важный

    Если вы случайно добавите неверные сведения виздателя , субъект или аудитории настройки учетных данных федеративного удостоверения успешно создаются без ошибок. Ошибка не становится очевидной до сбоя обмена токенами.

  • имя является уникальным идентификатором для учетных данных федеративной идентификации. Обязательно: это поле имеет ограничение в 3–120 символов и должно быть совместимо с URL. Поддерживаются буквенно-цифровые символы, дефисы или символы подчеркивания, а первый символ должен быть буквенно-цифровым. Он становится неизменяемым после создания.

  • описание — это предоставленное пользователем описание учетных данных федеративного удостоверения личности (необязательно). Описание не подтверждается и не проверяется Microsoft Entra ID. Это поле имеет ограничение в 600 символов.

Подстановочные знаки не поддерживаются в значении свойства учетных данных федеративного удостоверения.

Получение идентификатора объекта управляемого удостоверения

  1. Войдите на портал Azure .
  2. В поле поиска введите Управляемые удостоверения. В разделе Службывыберите Управляемые удостоверения.
  3. Найдите и выберите управляемое удостоверение, созданное пользователем в рамках предварительных требований.
  4. В области обзора скопируйте идентификатор объекта (субъект). Это значение используется в качестве поля субъекта в конфигурации федеративных удостоверений.

снимок экрана назначенного пользователем управляемого удостоверения на портале Azure. Выделен идентификатор объекта, который будет использоваться в качестве поля *тема* в конфигурации федеративных учетных данных.

Настройка учетных данных федеративного удостоверения в существующем приложении

В этом разделе вы настроите учетные данные федеративного удостоверения в существующем приложении, чтобы доверять управляемому удостоверению. Используйте следующие вкладки, чтобы выбрать, как настроить учетные данные федеративного удостоверения в существующем приложении.

  1. Войдите в Центр администрирования Microsoft Entra. Убедитесь, что вы находитесь в клиенте, где зарегистрировано приложение.

  2. Перейдите к Идентификация>приложения>регистрации приложенийи выберите ваше приложение в главном окне.

  3. В разделе Управлениевыберите Сертификаты & секретов.

  4. Перейдите на вкладку федеративных учетных данных и выберите Добавить учетные данные.

    снимок экрана: область сертификатов и секретов центра администрирования Microsoft Entra с выделенной вкладкой федеративных учетных данных.

  5. В раскрывающемся списке сценария федеративных учетных данных выберите Другой издатель и заполните значения в соответствии со следующей таблицей.

    Поле Описание Пример
    Эмитент URL-адрес издателя OAuth 2.0 / OIDC для удостоверяющего центра Microsoft Entra ID. https://login.microsoftonline.com/{tenantID}/v2.0
    Идентификатор субъекта Идентификатор Principal ID (GUID) управляемого удостоверения. aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb
    Имя Уникальное описательное имя учетных данных. msi-webapp1
    Описание (необязательно) Описание удостоверяющей информации, предоставленное пользователем. Доверять рабочие нагрузки UAMI для имитации приложения
    Публика Значение для аудитории, которое должно отображаться во внешнем маркере. публичное облако: api://AzureADTokenExchange
    Fairfax: api://AzureADTokenExchangeUSGov
    Лунокейк: api://AzureADTokenExchangeChina
    USNat: api://AzureADTokenExchangeUSNat
    USSec: api://AzureADTokenExchangeUSSec

    снимок экрана: окно учетных данных в Центре администрирования Microsoft Entra.

Обновите код вашего приложения для запроса токена доступа

В примерах кода, приведенных в таблице, показаны потоки клиентских учетных данных "service to service". Однако управляемые удостоверения в качестве учетных данных можно использовать в других потоках проверки подлинности, таких как потоки "от имени" (on-behalf-of, OBO). Примеры допустимы в обеих ситуациях: когда клиент ресурсов находится в том же арендаторе, что и регистрация приложения и управляемая идентичность, или в другом арендаторе.

Azure.Identity

В следующем примере показано, как подключиться к контейнеру хранилища Azure с помощью Azure.Identity, но можно адаптировать для доступа к любому ресурсу, защищенному Microsoft Entra. Примеры допустимы в обоих случаях, когда клиент ресурсов находится в одном клиенте с регистрацией приложения и управляемым удостоверением или другим клиентом.

using Azure.Identity;
using Azure.Storage.Blobs;

internal class Program
{
    // This example demonstrates how to access an Azure blob storage account by utilizing the manage identity credential.
  static void Main(string[] args)
  {
        string storageAccountName = "YOUR_STORAGE_ACCOUNT_NAME";
        string containerName = "CONTAINER_NAME";
        
        // The application must be granted access on the target resource
      string appClientId = "YOUR_APP_CLIENT_ID";

        // The tenant where the target resource is created, in this example, the storage account tenant
        // If the resource tenant different from the app tenant, your app needs to be 
      string resourceTenantId = "YOUR_RESOURCE_TENANT_ID";

        // The managed identity which you configured as a Federated Identity Credential (FIC)
      string miClientId = "YOUR_MANAGED_IDENTITY_CLIENT_ID"; 

        // Audience value must be one of the below values depending on the target cloud.
        // Public cloud: api://AzureADTokenExchange
        //  Fairfax: api://AzureADTokenExchangeUSGov
        //  Mooncake: api://AzureADTokenExchangeChina
        //  USNat: api://AzureADTokenExchangeUSNat
        //  USSec: api://AzureADTokenExchangeUSSec
      string audience = "api://AzureADTokenExchange";

        // 1. Create an assertion with the managed identity access token, so that it can be exchanged an app token
        var miCredential = new ManagedIdentityCredential(managedIdentityClientId);
        ClientAssertionCredential assertion = new(
            tenantId,
            appClientId,
            async (token) =>
            {
                // fetch Managed Identity token for the specified audience
                var tokenRequestContext = new Azure.Core.TokenRequestContext(new[] { $"{audience}/.default" });
                var accessToken = await miCredential.GetTokenAsync(tokenRequestContext).ConfigureAwait(false);
                return accessToken.Token;
            });

        // 2. The assertion can be used to obtain an App token (taken care of by the SDK)
        var containerClient  = new BlobContainerClient(new Uri($"https://{storageAccountName}.blob.core.windows.net/{containerName}"), assertion);

        await foreach (BlobItem blob in containerClient.GetBlobsAsync())
        {
            // TODO: perform operations with the blobs
            BlobClient blobClient = containerClient.GetBlobClient(blob.Name);
            Console.WriteLine($"Blob name: {blobClent.Name}, uri: {blobClient.Uri}");            
        }
  }
}

Microsoft.Identity.Web

В Microsoft.Identity.Webвеб-приложение или веб-API может заменить сертификат клиента подписанным утверждением клиента для проверки подлинности. В приложении можно обновить раздел ClientCredentials в appsettings.json до следующей конфигурации:

{
  "AzureAd": {
    "Instance": "https://login.microsoftonline.com/",
    "ClientId": "YOUR_APPLICATION_ID",
    "TenantId": "YOUR_TENANT_ID",

   "ClientCredentials": [
      {
        "SourceType": "SignedAssertionFromManagedIdentity",
        "ManagedIdentityClientId": "YOUR_USER_ASSIGNED_MANAGED_IDENTITY_CLIENT_ID",
        "TokenExchangeUrl":"api://AzureADTokenExchange"
      }
   ]
  }
}

MSAL (.NET)

В MSALможно использовать класс ManagedClientApplication для получения токена управляемой идентификации. Затем этот маркер можно использовать в качестве утверждения клиента при создании конфиденциального клиентского приложения.

Предупреждение

Для приложений .NET настоятельно рекомендуется использовать библиотеки более высокого уровня, основанные на MSAL, например Microsoft.Identity.Web или Azure.Identity.

using Microsoft.Identity.Client;
using Azure.Storage.Blobs;
using Azure.Core;

internal class Program
{
  static async Task Main(string[] args)
  {
        string storageAccountName = "YOUR_STORAGE_ACCOUNT_NAME";
        string containerName = "CONTAINER_NAME";

      string appClientId = "YOUR_APP_CLIENT_ID";
      string resourceTenantId = "YOUR_RESOURCE_TENANT_ID";
      Uri authorityUri = new($"https://login.microsoftonline.com/{resourceTenantId}");
      string miClientId = "YOUR_MI_CLIENT_ID";
      string audience = "api://AzureADTokenExchange";

      // Get mi token to use as assertion
      var miAssertionProvider = async (AssertionRequestOptions _) =>
      {
            var miApplication = ManagedIdentityApplicationBuilder
                .Create(ManagedIdentityId.WithUserAssignedClientId(miClientId))
                .Build();

            var miResult = await miApplication.AcquireTokenForManagedIdentity(audience)
                .ExecuteAsync()
                .ConfigureAwait(false);
            return miResult.AccessToken;
      };

      // Create a confidential client application with the assertion.
      IConfidentialClientApplication app = ConfidentialClientApplicationBuilder.Create(appClientId)
        .WithAuthority(authorityUri, false)
        .WithClientAssertion(miAssertionProvider)
        .WithCacheOptions(CacheOptions.EnableSharedCacheOptions)
        .Build();

        // Get the federated app token for the storage account
      string[] scopes = [$"https://{storageAccountName}.blob.core.windows.net/.default"];
      AuthenticationResult result = await app.AcquireTokenForClient(scopes).ExecuteAsync().ConfigureAwait(false);

        TokenCredential tokenCredential = new AccessTokenCredential(result.AccessToken);
        var client = new BlobContainerClient(
            new Uri($"https://{storageAccountName}.blob.core.windows.net/{containerName}"),
            tokenCredential);

        await foreach (BlobItem blob in containerClient.GetBlobsAsync())
        {
            // TODO: perform operations with the blobs
            BlobClient blobClient = containerClient.GetBlobClient(blob.Name);
            Console.WriteLine($"Blob name: {blobClient.Name}, URI: {blobClient.Uri}");
        }
  }
}

См. также