Migrer une application pour utiliser des connexions sans mot de passe avec Azure Cosmos DB for NoSQL

Les demandes d’application adressées à Azure Cosmos DB for NoSQL doivent être authentifiées. Bien qu’il existe plusieurs options pour l’authentification auprès d’Azure Cosmos DB, vous devez donner la priorité aux connexions sans mot de passe dans vos applications quand cela est possible. Les méthodes d’authentification traditionnelles qui utilisent des chaînes de connexion avec des mots de passe ou des clés secrètes créent des risques et des complications de sécurité. Visitez le hub de connexions sans mot de passe pour Azure Services pour découvrir l’avantage des connexions sans mot de passe.

Le tutoriel suivant explique comment migrer une application existante pour se connecter à Azure Cosmos DB for NoSQL à l’aide de connexions sans mot de passe au lieu d’une solution basée sur des clés.

Configurer des rôles et des utilisateurs pour l’authentification de développement local

Lors du développement local avec l’authentification sans mot de passe, assurez-vous que le compte d’utilisateur qui se connecte à Cosmos DB se voie attribuer un rôle avec les autorisations appropriées pour effectuer des opérations de données. Actuellement, Azure Cosmos DB for NoSQL n’inclut pas de rôles intégrés pour les opérations de données, mais vous pouvez créer les vôtres à l’aide d’Azure CLI ou de PowerShell.

Les rôles se composent d’une collection d’autorisations ou d’actions qu’un utilisateur est autorisé à effectuer, telles que la lecture, l’écriture et la suppression. Vous pouvez en savoir plus sur la configuration du contrôle d’accès en fonction du rôle (RBAC) dans la documentation sur la configuration de la sécurité Cosmos DB.

Créer le rôle personnalisé

  1. Attribuez un rôle à l’aide de la commande az role definition create. Transmettez le nom et le groupe de ressources du compte Cosmos DB, suivis d’un corps de JSON qui définit le rôle personnalisé. L’exemple suivant crée un rôle nommé PasswordlessReadWrite avec des autorisations pour lire et écrire des éléments dans des conteneurs Cosmos DB. Le rôle est également étendu au niveau du compte à l’aide de /.

    az cosmosdb sql role definition create \
        --account-name <cosmosdb-account-name> \
        --resource-group  <resource-group-name> \
        --body '{
        "RoleName": "PasswordlessReadWrite",
        "Type": "CustomRole",
        "AssignableScopes": ["/"],
        "Permissions": [{
            "DataActions": [
                "Microsoft.DocumentDB/databaseAccounts/readMetadata",
                "Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/items/*",
                "Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/*"
            ]
        }]
    }'
    
  2. Une fois la commande terminée, copiez la valeur d’ID du champ name et collez-la quelque part pour une utilisation ultérieure.

  3. Attribuez le rôle que vous avez créé au compte d’utilisateur ou au principal de service qui se connectera à Cosmos DB. Pendant le développement local, il s'agit généralement de votre propre compte connecté à un outil de développement tel que Visual Studio ou Azure CLI. Récupérez les détails de votre compte à l’aide de la commande az ad user.

    az ad user show --id "<your-email-address>"
    
  4. Copiez la valeur de la propriété iddans les résultats et collez-la quelque part pour une utilisation ultérieure.

  5. Attribuez le rôle personnalisé que vous avez créé pour votre compte d’utilisateur à l’aide de la commande az cosmosdb sql role assignment create et des identifiants copiés précédemment.

    az cosmosdb sql role assignment create \
        --account-name <cosmosdb-account-name> \
        --resource-group  <resource-group-name> \
        --scope "/" \
        --principal-id <your-user-id> \
        --role-definition-id <your-custom-role-id> 
    

Se connecter localement à Azure

Pour le développement local, vérifiez que vous êtes authentifié avec le même compte Microsoft Entra auquel vous avez attribué le rôle. Vous pouvez vous authentifier au moyen d’outils de développement populaires, comme Azure CLI ou Azure PowerShell. Les outils de développement avec lesquels vous pouvez vous authentifier dépendent de la langue.

Connectez-vous à Azure via Azure CLI à l’aide de la commande suivante :

az login

Migrer le code de l’application pour utiliser des connexions sans mot de passe

  1. Pour utiliser DefaultAzureCredential dans une application .NET, installez le Azure.Identity package :

    dotnet add package Azure.Identity
    
  2. Ajoutez le code suivant en haut de votre fichier :

    using Azure.Identity;
    
  3. Identifiez les emplacements de votre code qui créent un objet CosmosClient pour la connexion à Azure Cosmos DB. Mettez à jour votre code pour le faire correspondre à l’exemple suivant.

    DefaultAzureCredential credential = new();
    
    using CosmosClient client = new(
        accountEndpoint: Environment.GetEnvironmentVariable("COSMOS_ENDPOINT"),
        tokenCredential: credential
    );
    

Exécutez l’application localement.

Après avoir apporté ces modifications de code, exécutez votre application localement. La nouvelle configuration doit récupérer vos informations d’identification locales, telles qu’Azure CLI, Visual Studio ou IntelliJ. Les rôles que vous avez attribués à votre utilisateur de développement local dans Azure permettent à votre application de se connecter au service Azure localement.

Configurer l’environnement d’hébergement Azure

Une fois que votre application est configurée pour utiliser des connexions sans mot de passe et s’exécute localement, le même code peut s’authentifier auprès des services Azure après son déploiement sur Azure. Les sections suivantes expliquent comment configurer une application déployée pour se connecter à Azure Cosmos DB à l’aide d’une identité managée.

Créer l’identité managée

Vous pouvez créer une identité managée affectée par l’utilisateur à l’aide du Portail Azure ou d’Azure CLI. Votre application utilise l’identité pour s’authentifier auprès d’autres services.

  1. À partir du Portail Azure, recherchez Identités managées. Sélectionnez le résultat Identités managées.
  2. Sélectionnez + Créer en haut de la page de présentation des Identités managées.
  3. Sous l’onglet Informations de base, entrez les valeurs suivantes :
    • Abonnement : sélectionnez l’option souhaitée.
    • Groupe de ressources : sélectionnez votre groupe de ressources souhaité.
    • Région : sélectionnez une région proche de votre emplacement.
    • Nom : entrez un nom reconnaissable pour votre identité, par exemple MigrationIdentity.
  4. Au bas de la page, sélectionnez Examiner et créer.
  5. Une fois les vérifications de validation terminées, sélectionnez Créer. Azure crée une identité affectée par l’utilisateur.

Une fois la ressource créée, sélectionnez Accéder à la ressource pour afficher les détails de l’identité managée.

Capture d’écran montrant comment créer une identité managée affectée par l’utilisateur.

Associer l’identité managée à votre application web

Vous devez configurer votre application web pour utiliser l’identité managée créée. Attribuez l’identité à votre application à l’aide du Portail Azure ou d’Azure CLI.

Effectuez les étapes suivantes dans le Portail Azure pour associer une identité à votre application. Ces mêmes étapes s’appliquent aux services Azure suivants :

  • Azure Spring Apps
  • Azure Container Apps
  • Machines virtuelles Azure
  • Azure Kubernetes Service
  1. Accédez à la page de présentation de votre application web front-end.

  2. Sélectionnez Identité dans la barre de navigation de gauche.

  3. Dans la page Identité, basculez vers l’onglet Utilisateur affecté.

  4. Sélectionnez + Ajouter pour ouvrir le menu volant Ajouter une identité managée affectée par l’utilisateur.

  5. Sélectionnez l’abonnement utilisé précédemment pour créer l’identité.

  6. Recherchez MigrationIdentity par nom et sélectionnez-le dans les résultats de la recherche.

  7. Sélectionnez Ajouter pour associer l’identité à votre application.

    Capture d’écran montrant comment créer une identité affectée par l’utilisateur.

Attribuer des rôles à l’identité managée

Accordez des autorisations à l’identité managée en lui affectant le rôle personnalisé que vous avez créé, comme vous l’avez fait avec votre utilisateur de développement local.

Attribuez des rôles à l’aide de la commande az role assignment de l’interface de ligne de commande Azure.

az cosmosdb sql role assignment create \
    --account-name <cosmosdb-account-name> \
    --resource-group  <resource-group-name> \
    --scope "/" \
    --principal-id <managed-identity-id> \
    --role-definition-id <your-custom-role-id>

Mettre à jour le code d’application

Vous devez configurer votre code d’application pour rechercher l’identité managée spécifique créée lors du déploiement sur Azure. Dans certains scénarios, la définition explicite de l’identité managée pour l’application empêche également d’autres identités d’environnement d’être détectées et utilisées automatiquement par accident.

  1. Dans la page de présentation de l’identité managée, copiez la valeur de l’ID client dans votre Presse-papiers.

  2. Appliquez les modifications spécifiques au langage suivantes :

    Créez un objet DefaultAzureCredentialOptions et transmettez-le à DefaultAzureCredential. Définissez la propriété ManagedIdentityClientId sur l’ID client.

    DefaultAzureCredential credential = new(
        new DefaultAzureCredentialOptions
        {
            ManagedIdentityClientId = managedIdentityClientId
        });
    
  3. Redéployez votre code vers Azure après avoir apporté cette modification afin que les mises à jour de configuration soient appliquées.

Tester l’application

Après avoir déployé le code mis à jour, naviguez vers votre application hébergée dans le navigateur. Votre application doit être en mesure de se connecter à Cosmos DB avec succès. N’oubliez pas qu’il peut falloir plusieurs minutes pour que les attributions de rôle se propagent dans l’environnement Azure. Votre application est désormais configurée pour s’exécuter localement et dans un environnement de production sans que les développeurs n’aient à gérer les secrets dans l’application elle-même.

Étapes suivantes

Dans ce didacticiel, vous avez appris à migrer une application vers des connexions sans mot de passe.

Vous pouvez lire les ressources suivantes pour explorer les concepts abordés dans cet article plus en détails :