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


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

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

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

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

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

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

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

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

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

    Важный

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

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

  • Важный

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

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

    • глобальная служба Microsoft Entra ID: api://AzureADTokenExchange
    • Идентификатор Microsoft Entra для государственных организаций США: api://AzureADTokenExchangeUSGov
    • Microsoft Entra China, управляемая 21Vianet: api://AzureADTokenExchangeChina

    Важный

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

  • имя является уникальным идентификатором для учетных данных федеративной идентификации. Обязательно: это поле имеет ограничение в 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 для имитации приложения
    Публика Значение для аудитории, которое должно отображаться во внешнем маркере. Идентификатор глобальной службы Entra ID: api://AzureADTokenExchange
    • Entra ID для правительства США: api://AzureADTokenExchangeUSGov
    Entra ID China, управляемый 21Vianet: api://AzureADTokenExchangeChina

    снимок экрана: окно учетных данных в Центре администрирования 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.
    // Entra ID Global cloud: api://AzureADTokenExchange
    // Entra ID US Government: api://AzureADTokenExchangeUSGov
    // Entra ID China operated by 21Vianet: api://AzureADTokenExchangeChina
    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: {blobClient.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}");
        }
    }
}

См. также