Конфигурация приложения для доверия управляемому удостоверению (предварительная версия)
В этой статье описывается настройка приложения Microsoft Entra для доверия к управляемому удостоверению. Затем можно обменять токен управляемого удостоверения на токен доступа, который получает доступ к защищенным ресурсам Microsoft Entra без необходимости использования или управления секретами приложений.
Необходимые условия
- Учетная запись Azure с активной подпиской. создать учетную запись бесплатно.
- Эта учетная запись Azure должна иметь разрешения для управления приложениями, в частности для разрешений на обновление. Любые из следующих ролей Microsoft Entra включают необходимые разрешения:
- Понимание концепций управляемых удостоверений для ресурсов Azure.
- назначенное пользователем управляемое удостоверение назначено вычислительному ресурсу Azure (например, виртуальной машине или службе приложений Azure), на котором размещена рабочая нагрузка.
- Регистрация приложения в Microsoft Entra ID. Эта регистрация приложения должна принадлежать тому же клиенту, что и управляемое удостоверение.
- Если вам нужно получить доступ к ресурсам в другом клиенте, регистрация вашего приложения должна быть для мультитенантного приложения, чтобы развернуть приложение в другом клиенте. Кроме того, необходимо предоставить приложению разрешения на доступ к ресурсам в этом арендодателе. Узнайте , как добавить мультитенантное приложение в другие клиенты
- Регистрация приложения должна иметь доступ к защищенным ресурсам Microsoft Entra (например, Azure, Microsoft Graph, Microsoft 365 и т. д.). Этот доступ можно предоставить с помощью разрешений API
или делегированных разрешений .
Важные рекомендации и ограничения
Чтобы создать, обновить или удалить федеративные учетные данные, учетная запись, выполняющая действие, должна иметь роль администратора приложений , роль разработчика приложений , роль администратора облачных приложений или роль владельца приложения. Чтобы обновить федеративные удостоверения, требуется разрешение 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 символов.
Подстановочные знаки не поддерживаются в значении свойства учетных данных федеративного удостоверения.
Получение идентификатора объекта управляемого удостоверения
- Войдите на портал Azure .
- В поле поиска введите Управляемые удостоверения. В разделе Службывыберите Управляемые удостоверения.
- Найдите и выберите управляемое удостоверение, созданное пользователем в рамках предварительных требований.
- В области обзора
скопируйте идентификатор объекта (субъект). Это значение используется в качестве поля субъекта в конфигурации федеративных удостоверений.
Настройка учетных данных федеративного удостоверения в существующем приложении
В этом разделе вы настроите учетные данные федеративного удостоверения в существующем приложении, чтобы доверять управляемому удостоверению. Используйте следующие вкладки, чтобы выбрать, как настроить учетные данные федеративного удостоверения в существующем приложении.
- Центр администрирования Microsoft Entra
- Azure CLI
- PowerShell
- Интерфейсы программирования приложений (API)
- Бицепс
Войдите в Центр администрирования Microsoft Entra. Убедитесь, что вы находитесь в клиенте, где зарегистрировано приложение.
Перейдите к Идентификация>приложения>регистрации приложенийи выберите ваше приложение в главном окне.
В разделе Управлениевыберите Сертификаты & секретов.
Перейдите на вкладку федеративных учетных данных и выберите Добавить учетные данные.
В раскрывающемся списке сценария федеративных учетных данных выберите Другой издатель и заполните значения в соответствии со следующей таблицей.
Поле Описание Пример Эмитент 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
Обновите код вашего приложения для запроса токена доступа
В примерах кода, приведенных в таблице, показаны потоки клиентских учетных данных "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}");
}
}
}