Partage via


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 :
    • Administrateur d’application
    • développeur d’applications
    • Administrateur d’applications cloud
  • 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 , développeur d’applications, l’administrateur d’application cloudou le rôle Propriétaire de l’application. L’autorisation microsoft.directory/applications/credentials/update est nécessaire pour mettre à jour des informations d’identification d’identité fédérée.

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 de subject 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 revendications issuer et subject 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 revendication issuer 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é.

  • 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

  1. Connectez-vous au portail Azure .
  2. Dans la zone de recherche, entrez Identités managées. Sous Services, sélectionnez Identités managées.
  3. Recherchez et sélectionnez l'identité managée assignée par l'utilisateur que vous avez créée dans le cadre des prérequis.
  4. 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.

Capture d’écran d’une identité managée affectée par l’utilisateur dans le portail Azure. L’ID d’objet est mis en surbrillance, qui sera utilisé comme champ *subject* 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.

  1. Connectez-vous au centre d’administration Microsoft Entra . Vérifiez que vous êtes dans le locataire où votre application est enregistrée.

  2. Accédez à Identité>Applications>Inscriptions d'applications, puis sélectionnez votre application dans la fenêtre principale.

  3. Sous Gérer, sélectionnez Certificats et secrets.

  4. Sélectionnez l’onglet Informations d’identification fédérées et sélectionnez Ajouter des informations d’identification.

    Capture d’écran du volet certificats et secrets du Centre d’administration Microsoft Entra avec l’onglet Informations d’identification fédérées mis en surbrillance.

  5. 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

    Capture d’écran de la fenêtre d’informations d’identification dans le Centre d’administration Microsoft Entra.

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

Voir aussi