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


Настройка приложения для того, чтобы доверять управляемому удостоверению

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

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

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

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

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

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

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

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

  • subject: Это чувствительный к регистру GUID конечного идентификатора управляемого удостоверения, назначенного рабочей нагрузке Azure. Управляемая идентичность должна находиться в том же клиенте, что и регистрация приложения, даже если целевой ресурс находится в другом облаке. Платформа удостоверений Майкрософт отклонит обмен токенами, если subject в конфигурации учетных данных федеративного удостоверения не совпадает с Principal ID управляемого удостоверения.

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

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

    Важный

    Доступ к ресурсам в другом клиенте поддерживается. Доступ к ресурсам в другом облаке не поддерживается. Запросы токенов к другим облакам завершаются ошибкой.

    Важный

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

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

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

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

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

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

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

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

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

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

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

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

    Поле Описание Пример
    Эмитент URL-адрес эмитента OAuth 2.0 / OIDC идентификатора Microsoft Entra ID, который выдает токен управляемого удостоверения. Это значение автоматически заполняется текущим издателем клиента Entra. https://login.microsoftonline.com/{tenantID}/v2.0
    Выберите управляемое удостоверение Щёлкните эту ссылку, чтобы выбрать управляемую идентичность, которая будет выступать в качестве учётных данных федеративной идентичности. Вы можете использовать только управляемые удостоверения, назначенные пользователем, в качестве учетных данных. msi-webapp1
    Описание (необязательно) Описание удостоверяющей информации, предоставленное пользователем. Доверяйте рабочим нагрузкам UAMI как учетным данным для моего приложения
    Публика Значение для аудитории, которое должно отображаться во внешнем маркере. Необходимо задать одно из следующих значений:
    Идентификатор глобальной службы Entra ID: api://AzureADTokenExchange
    • Entra ID для правительства США: api://AzureADTokenExchangeUSGov
    Entra ID China, управляемый 21Vianet: api://AzureADTokenExchangeChina

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

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

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

Клиентские библиотеки идентификации Azure

В следующих примерах кода демонстрируется доступ к секрету Azure Key Vault, но его можно адаптировать для доступа к любому ресурсу, защищенному Microsoft Entra.

using Azure.Core;
using Azure.Identity;
using Azure.Security.KeyVault.Secrets;

// 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 miAudience = "api://AzureADTokenExchange";

// Create an assertion with the managed identity access token, so that it can be
// exchanged for an app token. Client ID is passed here. Alternatively, either
// object ID or resource ID can be passed.
ManagedIdentityCredential miCredential = new(
    ManagedIdentityId.FromUserAssignedClientId("<YOUR_MI_CLIENT_ID>"));
TokenRequestContext tokenRequestContext = new([$"{miAudience}/.default"]);
ClientAssertionCredential clientAssertionCredential = new(
    "<YOUR_RESOURCE_TENANT_ID>",
    "<YOUR_APP_CLIENT_ID>",
    async _ =>
        (await miCredential
            .GetTokenAsync(tokenRequestContext)
            .ConfigureAwait(false)).Token
);

// Create a new SecretClient using the assertion
SecretClient client = new(
    new Uri("https://testfickv.vault.azure.net/"), 
    clientAssertionCredential);

// Retrieve the secret
KeyVaultSecret secret = client.GetSecret("<SECRET_NAME>");

Веб-сайт Microsoft.Identity.Web

В Microsoft.Identity.Web вы можете задать ClientCredentials раздел в appsettings.json , чтобы разрешить коду использовать SignedAssertionFromManagedIdentity настроенное управляемое удостоверение в качестве учетных данных:

{
  "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/.default"
      }
    ]
  }
}

MSAL (.NET)

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

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

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/.default";

      // 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 containerClient = 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}");
        }
    }
}

См. также