Exercice : Masquer les données sensibles dans les applications natives cloud
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.
Dans la fenêtre TERMINAL, entrez la commande suivante :
cd /workspaces/mslearn-dotnet-cloudnative/dotnet-compliance/eShopLite/Store/
Ajoutez le package NuGet
Microsoft.Extensions.Compliance.Redaction
au projet :dotnet add package Microsoft.Extensions.Compliance.Redaction
Dans le volet EXPLORER, développez le dossier dotnet-compliance/eShopLite/Store, puis sélectionnez le fichier Program.cs.
Dans l’éditeur, ajoutez les dépendances suivantes :
using Microsoft.Extensions.Compliance.Classification; using Microsoft.Extensions.Compliance.Redaction;
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
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
Dans le volet EXPLORER, développez le dossier dotnet-compliance/eShopLite/Store/Services, puis sélectionnez le fichier ProductService.cs.
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); }
Dans l’éditeur, dans la tâche
CreateOrder
, appelez la méthodeLogOrders
: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.
Dans le volet TERMINAL en bas, accédez au dossier dotnet-compliance/eShopLite.
cd ..
Mettez à jour les conteneurs d’applications.
dotnet publish /p:PublishProfile=DefaultContainer
Accédez au dossier dotnet-compliance et démarrez l’application avec Docker :
cd .. docker compose up
Sélectionnez l’onglet PORTS, puis sélectionnez l’icône de globe Ouvrir dans le navigateur pour le port Front-end (32000).
Sélectionnez le lien Produits. Ajoutez des produits à votre panier d’achat.
Sélectionnez le bouton Acheter le panier.
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.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 *****
.
Dans le volet EXPLORER, développez le dossier dotnet-compliance/eShopLite/DataEntities, puis sélectionnez le fichier Compliance.cs.
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
Dans le volet EXPLORER, développez le dossier dotnet-compliance/eShopLite/Store, puis sélectionnez le fichier Program.cs.
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éeEShopCustomRedactor
pour les données EUII.
Testez la nouvelle implémentation de masquage
Dans la fenêtre TERMINAL, générez et exécutez l’application :
docker-compose up --build
Sélectionnez l’onglet PORTS, puis sélectionnez l’icône de globe Ouvrir dans le navigateur pour le port Front-end (32000).
Sélectionnez le lien Produits. Ajoutez des produits à votre panier d’achat.
Sélectionnez le bouton Acheter le panier.
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
*****.
Dans la fenêtre TERMINAL, appuyez sur Ctrl+C pour arrêter l’application.