Configurer une application pour approuver une identité managée (préversion)
Cet article explique comment configurer une application Microsoft Entra pour approuver une identité managée. Vous pouvez ensuite échanger le jeton d’identité managée pour un jeton d’accès qui peut accéder aux ressources protégées de Microsoft Entra sans avoir à utiliser ou à gérer les secrets d’application.
Conditions préalables
- Un compte Azure avec un abonnement actif. Créer un compte gratuitement.
- Ce compte Azure doit disposer d’autorisations pour gérer les applications, en particulier pour mettre à jour les autorisations. Les rôles Microsoft Entra suivants incluent les autorisations requises :
- Compréhension des concepts de identités managées pour les ressources Azure.
- Une identité managée affectée par l’utilisateur affectée à la ressource de calcul Azure (par exemple, une machine virtuelle ou Azure App Service) qui héberge votre charge de travail.
- Un enregistrement d'application dans Microsoft Entra ID. Cette inscription d'application doit appartenir au même locataire que l'identité gérée.
- Si vous devez accéder aux ressources d'un autre client, l'enregistrement de votre application doit être celui d'une application multitenante et déployer l'application dans l'autre client. En outre, vous devez accorder les autorisations d’accès à l’application sur les ressources de ce locataire. Découvrez comment ajouter une application mutualisée dans d’autres locataires
- L’inscription de l’application doit avoir accès aux ressources protégées Microsoft Entra (par exemple, Azure, Microsoft Graph, Microsoft 365, etc.). Cet accès peut être accordé via des autorisations d’API ou des autorisations déléguées .
Considérations et restrictions importantes
Pour créer, mettre à jour ou supprimer des informations d’identification d’identité fédérée, le compte effectuant l’action doit avoir leadministrateur d’application
Un maximum de 20 informations d’identification d’identité fédérée peuvent être ajoutées à une application ou à une identité managée affectée par l’utilisateur.
Lorsque vous configurez des informations d’identification d’identité fédérée, il existe plusieurs informations importantes à fournir :
issuer et subject sont les éléments clés nécessaires à la configuration de la relation d’approbation. La combinaison de
issuer
et desubject
doit être unique sur l’application. Lorsque la charge de travail Azure demande à la plateforme d’identités Microsoft d’échanger le jeton d’identité géré par un jeton d'accès, les valeurs émetteur et sujet des informations d’identification fédérées sont vérifiées par rapport aux revendicationsissuer
etsubject
fournies dans le jeton d’identité managée. Si cette vérification de validation réussit, la plateforme d’identités Microsoft émet un jeton d’accès à la charge de travail logicielle externe.émetteur est l’URL de l’autorité du locataire Microsoft Entra sous la forme
https://login.microsoftonline.com/{tenant}/v2.0
. L’application Microsoft Entra et l’identité managée doivent appartenir au même locataire. Si la revendicationissuer
a un espace blanc de début ou de fin dans la valeur, l’échange de jetons est bloqué.Important
Bien que l'inscription de l'application et l'identité gérée se trouvent dans le même locataire, le principal de service de l'inscription de l'application peut toujours utiliser le jeton d'identité gérée.
sujet est le GUID de l’ID de sujet de l’identité managée (ID principal) affecté à la charge de travail Azure. La plateforme d’identités Microsoft examine le jeton externe entrant et rejette l’échange d’un jeton d’accès si le champ sujet configuré dans les informations d’identification de l’identité fédérée ne correspond pas à l’ID principal de l’identité managée. Le GUID respecte la casse.
-
Important
Vous ne pouvez utiliser les identités gérées User-Assigned que dans cette fonctionnalité.
*audiences répertorient les audiences qui peuvent apparaître dans le jeton externe (obligatoire). Vous devez ajouter une valeur d’audience unique, qui a une limite de 600 caractères. La valeur doit être l’une des valeurs suivantes et doit correspondre à la valeur de la revendication
aud
dans le jeton d’identité managée.- cloud public :
api://AzureADTokenExchange
- Fairfax :
api://AzureADTokenExchangeUSGov
- Mooncake :
api://AzureADTokenExchangeChina
- USNat :
api://AzureADTokenExchangeUSNat
- USSec :
api://AzureADTokenExchangeUSSec
Important
Si vous ajoutez accidentellement des informations incorrectes dans le paramètre émetteur, sujet ou audience, les informations d’identification de l’identité managée est créée correctement sans erreur. L’erreur n’apparaît pas tant que l’échange de jetons n’a pas échoué.
- cloud public :
name est l’identificateur unique des informations d’identification d’identité fédérée. (Obligatoire) Ce champ a une limite de caractères de 3 à 120 caractères et doit être convivial pour l’URL. Les caractères alphanumériques, un tiret ou un trait de soulignement sont pris en charge, et le premier caractère doit être uniquement alphanumérique. Il est immuable une fois créé.
description est la description fournie par l’utilisateur des informations d’identification d’identité fédérée (facultatif). La description n’est pas validée ou vérifiée par l’ID Microsoft Entra. Ce champ a une limite de 600 caractères.
Les caractères génériques ne sont pris en charge dans aucune des valeurs de propriété d’informations d’identification d’identité fédérées.
Obtenir l’ID d’objet de l’identité managée
- Connectez-vous au portail Azure .
- Dans la zone de recherche, entrez Identités managées. Sous Services, sélectionnez Identités managées.
- Recherchez et sélectionnez l'identité managée assignée par l'utilisateur que vous avez créée dans le cadre des prérequis.
- Dans le volet Vue d'ensemble, copiez la valeur de l'ID d'objet (principal) . Cette valeur est utilisée comme champ objet dans la configuration des informations d’identification fédérées.
Configurer des informations d’identification d’identité fédérée sur une application existante
Dans cette section, vous allez configurer des informations d’identification d’identité fédérée sur une application existante pour approuver une identité managée. Utilisez les onglets suivants pour choisir comment configurer des informations d’identification d’identité fédérées sur une application existante.
Connectez-vous au centre d’administration Microsoft Entra . Vérifiez que vous êtes dans le locataire où votre application est enregistrée.
Accédez à Identité>Applications>Inscriptions d'applications, puis sélectionnez votre application dans la fenêtre principale.
Sous Gérer, sélectionnez Certificats et secrets.
Sélectionnez l’onglet Informations d’identification fédérées et sélectionnez Ajouter des informations d’identification.
Dans la liste déroulante du scénario d'informations d'identification fédérées , sélectionnez Autre Émetteur et renseignez les valeurs en fonction du tableau suivant :
Champ Description Exemple Émetteur URL de l’émetteur OAuth 2.0 / OIDC de l’autorité Microsoft Entra ID. https://login.microsoftonline.com/{tenantID}/v2.0
Identificateur de l’objet Le Principal ID
GUID de l’identité managée.aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb
Nom Nom descriptif unique pour les informations d'identification. msi-webapp1 Description (facultatif) Description fournie par l'utilisateur du crédentiel d'identité fédérée. Faire confiance aux charges de travail UAMI pour emprunter l’identité de l’application Public visé La valeur d’audience qui doit figurer dans le jeton externe. • cloud public: api://AzureADTokenExchange
• Fairfax: api://AzureADTokenExchangeUSGov
• Mooncake: api://AzureADTokenExchangeChina
• USNat: api://AzureADTokenExchangeUSNat
• USSec: api://AzureADTokenExchangeUSSec
Mettre à jour votre code d’application pour demander un jeton d’accès
Les exemples de code suivants dans le tableau suivant montrent les flux d’informations d’identification du client « service à service ». Toutefois, les identités managées en tant qu’informations d’identification peuvent être utilisées dans d’autres flux d’authentification tels que les flux OBO (on-behalf-of). Les exemples sont valides dans les deux cas : lorsque le locataire de ressource se trouve dans le même locataire que l’inscription de l'application et l'identité managée, ou dans un locataire différent.
Azure.Identity
L’exemple suivant montre comment se connecter à un conteneur de stockage Azure à l’aide de Azure.Identity
, mais peut être adapté pour accéder à n’importe quelle ressource protégée par Microsoft Entra. Les exemples sont valides dans les deux cas où le locataire de ressource se trouve dans le même locataire que l'enregistrement de l'application et l'identité managée, ou que l'identité managée se trouve dans un autre locataire.
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
Dans microsoft.Identity.Web, une application web ou une API web peut remplacer le certificat client par une assertion de client signée pour l’authentification. Dans votre application, vous pouvez mettre à jour la section ClientCredentials
de votre appsettings.json vers la configuration suivante :
{
"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)
Dans MSAL, vous pouvez utiliser la classe ManagedClientApplication pour acquérir un jeton d’identité managée. Ce jeton peut ensuite être utilisé comme assertion cliente lors de la construction d’une application cliente confidentielle.
Avertissement
Pour les applications .NET, nous vous conseillons vivement d’utiliser des bibliothèques de niveau supérieur basées sur MSAL, telles que microsoft.Identity.Web ou 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}");
}
}
}