Partager via


Configurer des connexions sans mot de passe entre plusieurs applications et services Azure

Les applications nécessitent souvent des connexions sécurisées entre plusieurs services Azure simultanément. Par exemple, une instance Azure App Service d’entreprise peut se connecter à plusieurs comptes de stockage différents, une instance de base de données Azure SQL, un Service Bus, etc.

Les identités managées sont l’option d’authentification recommandée pour les connexions sécurisées sans mot de passe entre les ressources Azure. Les développeurs n’ont pas à suivre et gérer manuellement de nombreux secrets différents pour les identités managées, car la plupart de ces tâches sont gérées en interne par Azure. Ce didacticiel explique comment gérer les connexions entre plusieurs services à l’aide d’identités managées et de la bibliothèque cliente Azure Identity.

Comparer les types d’identités managées

Azure fournit les types d’identités managées suivantes :

  • Les identités managées affectées par le système sont directement liées à une seule ressource Azure. Lorsque vous activez une identité managée affectée par le système sur un service, Azure crée une identité liée et gère les tâches administratives pour cette identité en interne. Quand la ressource Azure est supprimée, l’identité l’est aussi.
  • Les identités managées affectées par l’utilisateur sont des identités indépendantes créées par un administrateur et peuvent être associées à une ou plusieurs ressources Azure. Le cycle de vie de l’identité est indépendant de ces ressources.

Vous pouvez en savoir plus sur les meilleures pratiques et quand utiliser des identités managées affectées par le système et des identités managées affectées par l’utilisateur dans les recommandations de meilleures pratiques des identités managées.

Explorer DefaultAzureCredential

Les identités managées sont plus facilement implémentées dans votre code d’application via une classe appelée DefaultAzureCredential à partir de la bibliothèque de client Azure Identity. DefaultAzureCredential prend en charge plusieurs mécanismes d’authentification et détermine automatiquement celle qui doit être utilisée au moment de l’exécution. En savoir plus sur DefaultAzureCredential pour les écosystèmes suivants :

Connecter une application hébergée sur Azure à plusieurs services Azure

Imaginez que vous avez été chargé de connecter une application existante à plusieurs services et bases de données Azure à l’aide de connexions sans mot de passe. L’application est une API web ASP.NET Core hébergée sur Azure App Service, bien que les étapes ci-dessous s’appliquent également à d’autres environnements d’hébergement Azure, tels qu’Azure Spring Apps, Machines Virtuelles, Container Apps et AKS.

Ce didacticiel s’applique aux architectures suivantes, bien qu’il puisse être adapté à de nombreux autres scénarios ainsi qu’à des modifications de configuration minimales.

Diagramme montrant les relations de l’identité affectée par l’utilisateur.

Les étapes suivantes montrent comment configurer une application pour utiliser une identité managée affectée par le système et votre compte de développement local pour se connecter à plusieurs services Azure.

Créer une identité managée affectée par le système

  1. Dans le Portail Azure, accédez à l’application hébergée que vous souhaitez vous connecter à d’autres services.

  2. Sur la page vue d’ensemble du service, sélectionnez Identité.

  3. Basculez le paramètre d’Etat sur Activé pour activer une identité managée affectée par le système pour le service.

    Capture d’écran montrant comment affecter une identité managée affectée par le système.

Attribuer des rôles à l’identité managée pour chaque service connecté

  1. Accédez à la page vue d’ensemble du compte de stockage auquel vous souhaitez accorder l’accès à votre identité.

  2. Sélectionnez Contrôle d’accès (IAM) à partir de la navigation du compte de stockage.

  3. Choisissez + Ajouter, puis Ajouter une attribution de rôle.

    Capture d’écran montrant comment localiser la section du Portail Azure pour l’attribution d’un rôle à une identité managée affectée par le système.

  4. Dans la zone de recherche de Rôle, recherchez le Contributeur de données Blob de stockage, qui accorde des autorisations pour effectuer des opérations de lecture et d’écriture sur les données d’objets blob. Vous pouvez attribuer le rôle approprié pour votre cas d’usage. Sélectionnez le contributeur de données blob de stockage dans la liste, puis choisissez Suivant.

  5. Sur l’écran Ajouter une attribution de rôle, pour l’option Attribuer l’accès à l’option , sélectionnez Identité managée. Choisissez ensuite +Sélectionner des membres.

  6. Dans le menu volant, recherchez l’identité managée que vous avez créée en entrant le nom de votre App Service. Sélectionnez l’identité affectée par le système, puis Sélectionner pour fermer le menu volant.

    Capture d’écran montrant comment attribuer un rôle à une identité managée affectée par le système dans le Portail Azure.

  7. Sélectionnez Suivant plusieurs fois jusqu’à ce que vous puissiez sélectionner Vérifier + attribuer pour terminer l’attribution de rôle.

  8. Répétez ce processus pour les autres services auxquels vous souhaitez vous connecter.

Considérations relatives au développement local

Vous pouvez également activer l’accès aux ressources Azure pour le développement local en affectant des rôles à un compte d’utilisateur de la même façon que vous avez attribué des rôles à votre identité managée.

  1. Après avoir attribué le rôle Contributeur de données Blob de stockage à votre identité managée, sous Attribuer l’accès à, cette fois sélectionnez Utilisateur, groupe ou principal de service. Choisissez + Sélectionner des membres pour ouvrir à nouveau le menu volant.

  2. Recherchez le compte user@domain ou le groupe de sécurité Microsoft Entra auquel vous souhaitez accorder l’accès par adresse e-mail ou par nom, puis sélectionnez-le. Il doit s’agir du même compte que celui que vous utilisez pour vous connecter à vos outils de développement local, tels que Visual Studio ou Azure CLI.

Remarque

Vous pouvez également attribuer ces rôles à un groupe de sécurité Microsoft Entra si vous travaillez sur une équipe avec plusieurs développeurs. Vous pouvez ensuite placer n’importe quel développeur dans ce groupe qui a besoin d’accéder au développement de l’application localement.

Implémenter le code de l’application

  1. Dans votre projet, installez le package Azure.Identity. Cette bibliothèque fournit DefaultAzureCredential. Vous pouvez également ajouter toutes les autres bibliothèques Azure qui sont pertinentes pour votre application. Pour cet exemple, les packages Azure.Storage.Blobs et Azure.Messaging.ServiceBus sont ajoutés pour se connecter au stockage Blob et Service Bus, respectivement.

    dotnet add package Azure.Identity
    dotnet add package Azure.Messaging.ServiceBus
    dotnet add package Azure.Storage.Blobs
    
  2. Instanciez les clients de service pour les services Azure auxquels votre application doit se connecter. L’exemple de code suivant interagit avec le Stockage Blob et Service Bus à l’aide des clients de service correspondants.

    using Azure.Identity;
    using Azure.Messaging.ServiceBus;
    using Azure.Storage.Blobs;
    
    // Create DefaultAzureCredential instance that uses system-assigned managed identity
    // in the underlying ManagedIdentityCredential.
    DefaultAzureCredential credential = new();
    
    BlobServiceClient blobServiceClient = new(
        new Uri("https://<your-storage-account>.blob.core.windows.net"),
        credential);
    
    ServiceBusClient serviceBusClient = new("<your-namespace>", credential);
    ServiceBusSender sender = serviceBusClient.CreateSender("producttracking");
    

Lorsque ce code s’exécute localement, DefaultAzureCredential recherche sa chaîne d’informations d’identification pour obtenir les premières informations d’identification disponibles. Si la variable d’environnement Managed_Identity_Client_ID est nulle localement, les informations d’identification correspondant à un outil de développement installé localement sont utilisées. Par exemple, Azure CLI ou Visual Studio. Pour en savoir plus sur ce processus, consultez la section Explorer DefaultAzureCredential.

Lorsque l’application est déployée sur Azure, DefaultAzureCredential récupère automatiquement la variable Managed_Identity_Client_ID à partir de l’environnement App Service. Cette valeur devient disponible lorsqu’une identité managée est associée à votre application.

Ce processus global garantit que votre application peut s’exécuter en toute sécurité localement et dans Azure sans avoir besoin de modifications de code.

Connectez plusieurs applications à l’aide de plusieurs identités managées

Bien que les applications de l’exemple précédent partagent les mêmes exigences d’accès au service, les environnements réels sont souvent plus nuancés. Envisagez un scénario où plusieurs applications se connectent aux mêmes comptes de stockage, mais deux des applications accèdent également à différents services ou bases de données.

Diagramme montrant plusieurs identités managées affectées par l’utilisateur.

Pour configurer cette configuration dans votre code, assurez-vous que votre application inscrit des clients de services distincts pour se connecter à chaque compte de stockage ou base de données. Faites référence aux ID du client d’identité managée corrects pour chaque service lors de la configuration de DefaultAzureCredential. Les exemples de code suivants configurent ces connexions de service Azure :

  • Deux connexions à des comptes de stockage distincts à l’aide d’une identité managée affectée par l’utilisateur partagé
  • Connexion aux services Azure Cosmos DB et Azure SQL à l’aide d’une deuxième identité managée affectée par l’utilisateur. Cette identité managée est partagée lorsque le pilote client Azure SQL l’autorise. Pour plus d'informations, consultez les commentaires du code.
  1. Dans votre projet, installez les packages nécessaires. La bibliothèque Azure Identity fournit DefaultAzureCredential.

    dotnet add package Azure.Identity
    dotnet add package Azure.Storage.Blobs
    dotnet add package Microsoft.Azure.Cosmos
    dotnet add package Microsoft.Data.SqlClient
    
  2. Ajoutez ce qui suit à votre code :

    using Azure.Core;
    using Azure.Identity;
    using Azure.Storage.Blobs;
    using Microsoft.Azure.Cosmos;
    using Microsoft.Data.SqlClient;
    
    string clientIdStorage =
        Environment.GetEnvironmentVariable("Managed_Identity_Client_ID_Storage")!;
    
    // Create a DefaultAzureCredential instance that configures the underlying
    // ManagedIdentityCredential to use a user-assigned managed identity.
    DefaultAzureCredential credentialStorage = new(
        new DefaultAzureCredentialOptions
        {
            ManagedIdentityClientId = clientIdStorage,
        });
    
    // First Blob Storage client
    BlobServiceClient blobServiceClient1 = new(
        new Uri("https://<receipt-storage-account>.blob.core.windows.net"),
        credentialStorage);
    
    // Second Blob Storage client
    BlobServiceClient blobServiceClient2 = new(
        new Uri("https://<contract-storage-account>.blob.core.windows.net"),
        credentialStorage);
    
    string clientIdDatabases =
        Environment.GetEnvironmentVariable("Managed_Identity_Client_ID_Databases")!;
    
    // Create a DefaultAzureCredential instance that configures the underlying
    // ManagedIdentityCredential to use a user-assigned managed identity.
    DefaultAzureCredential credentialDatabases = new(
        new DefaultAzureCredentialOptions
        {
            ManagedIdentityClientId = clientIdDatabases,
        });
    
    // Create an Azure Cosmos DB client
    CosmosClient cosmosClient = new(
        Environment.GetEnvironmentVariable("COSMOS_ENDPOINT", EnvironmentVariableTarget.Process),
        credentialDatabases);
    
    // Open a connection to Azure SQL
    string connectionString =
        $"Server=<azure-sql-hostname>.database.windows.net;User Id={clientIdDatabases};Authentication=Active Directory Default;Database=<database-name>";
    
    using (SqlConnection connection = new(connectionString)
    {
        AccessTokenCallback = async (authParams, cancellationToken) =>
        {
            const string defaultScopeSuffix = "/.default";
            string scope = authParams.Resource.EndsWith(defaultScopeSuffix)
                ? authParams.Resource
                : $"{authParams.Resource}{defaultScopeSuffix}";
            AccessToken token = await credentialDatabases.GetTokenAsync(
                new TokenRequestContext([scope]),
                cancellationToken);
    
            return new SqlAuthenticationToken(token.Token, token.ExpiresOn);
        }
    })
    {
        connection.Open();
    }
    

Vous pouvez également associer une identité managée affectée par l’utilisateur et une identité managée affectée par le système à une ressource simultanément. Cela peut être utile dans les scénarios où toutes les applications nécessitent l’accès aux mêmes services partagés, mais l’une des applications a également une dépendance spécifique sur un service supplémentaire. L’utilisation d’une identité managée affectée par le système garantit également que l’identité liée à cette application spécifique est supprimée lorsque l’application est supprimée, ce qui peut vous aider à nettoyer votre environnement.

Diagramme montrant des identités managées affectées par l’utilisateur et par le système.

Ces types de scénarios sont explorés plus en détail dans les recommandations de meilleures pratiques des identités managées.

Étapes suivantes

Dans ce didacticiel, vous avez appris à migrer une application vers des connexions sans mot de passe. Consultez les ressources suivantes pour explorer les concepts abordés dans cet article plus en détails :