Exercice : Masquer les données sensibles dans les applications natives cloud

Effectué

Vous devez ajouter une journalisation au processus de commande. Vous allez utiliser les fonctionnalités de masquage de .NET pour vous assurer que les données sensibles ne sont pas divulguées dans les journaux.

Dans cet exercice, vous allez :

  • Ajouter le package NuGet Microsoft.Extensions.Compliance.Redaction à chaque projet.
  • Ajouter le service de rédaction au conteneur d’injection de dépendances.
  • Activer la rédaction dans l’infrastructure de journalisation.
  • Appelez le framework de journalisation pendant le processus de commande.
  • Ajoutez une implémentation de masquage personnalisée pour les données EUII.
  • Choisir l’implémentation de la réaction à utiliser pour chaque type de données classifiées.

Ajoutez le service de masquage

Vous devez toujours ouvrir le codespace ou la fenêtre Visual Studio Code. Si ce n’est pas le cas, ouvrez-le maintenant.

  1. Dans la fenêtre TERMINAL, entrez la commande suivante :

    cd /workspaces/mslearn-dotnet-cloudnative/dotnet-compliance/eShopLite/Store/
    
  2. Ajoutez le package NuGet Microsoft.Extensions.Compliance.Redaction au projet :

    dotnet add package Microsoft.Extensions.Compliance.Redaction
    
  3. Dans le volet EXPLORER, développez le dossier dotnet-compliance/eShopLite/Store, puis sélectionnez le fichier Program.cs.

  4. Dans l’éditeur, ajoutez les dépendances suivantes :

    using Microsoft.Extensions.Compliance.Classification;
    using Microsoft.Extensions.Compliance.Redaction;
    
  5. Faites défiler jusqu’à la ligne 19, sous le commentaire Add redaction, ajoutez le service de masquage au conteneur d’injection de dépendances :

    builder.Services.AddRedaction();
    

Activation du masquage dans le framework de journalisation

  1. Dans l’éditeur, ajoutez ce code sous la ligne AddRedaction() :

    builder.Services.AddLogging(logging => 
    {
        logging.EnableRedaction();
        logging.AddJsonConsole(); //Enable structure logs on the console to view the redacted data.
    });
    

    Le code ci-dessus active le masquage dans le framework de journalisation.

Appelez le framework de journalisation pendant le processus de commande

  1. Dans le volet EXPLORER, développez le dossier dotnet-compliance/eShopLite/Store/Services, puis sélectionnez le fichier ProductService.cs.

  2. Dans l’éditeur, en bas du fichier, ajoutez ce code :

    public static partial class Log
    {
        [LoggerMessage(1, LogLevel.Information, "Placed Order: {order}")]
        public static partial void LogOrders(this ILogger logger, [LogProperties] Order order);
    }
    
  3. Dans l’éditeur, dans la tâche CreateOrder, appelez la méthode LogOrders :

    public async Task<bool> CreateOrder(Order order)
    {
        try
        {
            _logger.LogOrders(order);
    

    Le code ci-dessus appelle la méthode LogOrders et le transmet aux informations de commande actuelles.

Testez la nouvelle journalisation masquée

Une fois le code ci-dessus mis en place, l’application peut utiliser l’implémentation de masquage par défaut pour masquer l’information Order. Vous allez maintenant tester cela.

  1. Dans le volet TERMINAL en bas, accédez au dossier dotnet-compliance/eShopLite.

    cd ..
    
  2. Mettez à jour les conteneurs d’applications.

    dotnet publish /p:PublishProfile=DefaultContainer 
    
  3. Accédez au dossier dotnet-compliance et démarrez l’application avec Docker :

    cd ..
    docker compose up
    
  4. Sélectionnez l’onglet PORTS, puis sélectionnez l’icône de globe Ouvrir dans le navigateur pour le port Front-end (32000).

  5. Sélectionnez le lien Produits. Ajoutez des produits à votre panier d’achat.

  6. Sélectionnez le bouton Acheter le panier.

  7. Dans la fenêtre TERMINAL, appuyez sur Ctrl+F, puis dans le champ de recherche, entrez "EventId":1,.

    frontend-1  | {"EventId":1,"LogLevel":"Information","Category":"Store.Services.ProductService","Message":"Placed Order: DataEntities.Order","State":{"Message":"Microsoft.Extensions.Logging.ExtendedLogger\u002BModernTagJoiner","{OriginalFormat}":"Placed Order: {order}","order.Total":209.94,"order.Products":"[\u0022DataEntities.Product\u0022,\u0022DataEntities.Product\u0022,\u0022DataEntities.Product\u0022,\u0022DataEntities.Product\u0022,\u0022DataEntities.Product\u0022,\u0022DataEntities.Product\u0022]","order":"DataEntities.Order","order.CustomerAddress":"","order.CustomerName":"","order.Id":""}}
    

    Vous devriez voir cette entrée de journal au format JSON. Notez que la valeur order.Total se trouve dans les journaux, mais que les valeurs CustomerName et CustomerAddress sont des chaînes vides.

    Par défaut, si vous ne spécifiez pas d’implémentation de masquage, le moteur de masquage utilisera l’implémentation ErasingRedactor pour s’assurer qu’aucune donnée sensible n’est divulguée dans les journaux.

  8. Dans la fenêtre TERMINAL, appuyez sur Ctrl+C pour arrêter l’application.

Ajoutez une implémentation de masquage personnalisée

Vous allez maintenant améliorer l’implémentation de masquage afin d’utiliser différents algorithmes de masquage pour différents types de données. Tout d’abord, vous allez ajouter une nouvelle implémentation de masquage personnalisée qui remplace la valeur par *****.

  1. Dans le volet EXPLORER, développez le dossier dotnet-compliance/eShopLite/DataEntities, puis sélectionnez le fichier Compliance.cs.

  2. Dans l’éditeur, en bas du fichier, ajoutez ce code :

    public class EShopCustomRedactor : Redactor
    {
        private const string Stars = "*****";
    
        public override int GetRedactedLength(ReadOnlySpan<char> input) => Stars.Length;
    
        public override int Redact(ReadOnlySpan<char> source, Span<char> destination)
        {
            Stars.CopyTo(destination);
            return Stars.Length;
        }
    }
    

    Le code ci-dessus met à la disposition du moteur de masquage une méthode de masquage EShopCustomRedactor.

Choisissez l’implémentation de masquage à utiliser

  1. Dans le volet EXPLORER, développez le dossier dotnet-compliance/eShopLite/Store, puis sélectionnez le fichier Program.cs.

  2. Remplacez le code builder.Services.AddRedaction(); pour fournir la configuration du moteur de masquage :

    builder.Services.AddRedaction(configure =>
    {
        configure.SetRedactor<ErasingRedactor>(new DataClassificationSet(DataClassifications.EUPDataClassification));
        configure.SetRedactor<EShopCustomRedactor>(new DataClassificationSet(DataClassifications.EUIIDataClassification));
    });
    

    Le code ci-dessus configure le moteur de masquage afin qu’il utilise spécifiquement l’implémentation ErasingRedactor pour les données EUP et la nouvelle implémentation personnalisée EShopCustomRedactor pour les données EUII.

Testez la nouvelle implémentation de masquage

  1. Dans la fenêtre TERMINAL, générez et exécutez l’application :

    docker-compose up --build
    
  2. Sélectionnez l’onglet PORTS, puis sélectionnez l’icône de globe Ouvrir dans le navigateur pour le port Front-end (32000).

  3. Sélectionnez le lien Produits. Ajoutez des produits à votre panier d’achat.

  4. Sélectionnez le bouton Acheter le panier.

  5. Dans la fenêtre TERMINAL, appuyez sur Ctrl+F, puis dans le champ de recherche, entrez "EventId":1,.

    frontend-1  | {"EventId":1,"LogLevel":"Information","Category":"Store.Services.ProductService","Message":"Placed Order: DataEntities.Order","State":{"Message":"Microsoft.Extensions.Logging.ExtendedLogger\u002BModernTagJoiner","{OriginalFormat}":"Placed Order: {order}","order.Total":269.88,"order.Products":"[\u0022DataEntities.Product\u0022,\u0022DataEntities.Product\u0022,\u0022DataEntities.Product\u0022,\u0022DataEntities.Product\u0022,\u0022DataEntities.Product\u0022,\u0022DataEntities.Product\u0022,\u0022DataEntities.Product\u0022,\u0022DataEntities.Product\u0022,\u0022DataEntities.Product\u0022,\u0022DataEntities.Product\u0022,\u0022DataEntities.Product\u0022,\u0022DataEntities.Product\u0022]","order":"DataEntities.Order","order.CustomerAddress":"*****","order.CustomerName":"*****","order.Id":""}}
    

    Vous devriez voir cette entrée de journal au format JSON. Notez que la valeur order.Id est toujours une chaîne vide, mais que les valeurs CustomerName et CustomerAddress sont maintenant *****.

  6. Dans la fenêtre TERMINAL, appuyez sur Ctrl+C pour arrêter l’application.