Exercício: redigir dados confidenciais em aplicativos nativos de nuvem
Você precisa adicionar alguns logs ao processo de ordem. Você usará os recursos de redação do .NET para garantir que os dados confidenciais não sejam vazados nos logs.
Neste exercício, você vai:
- Adicionar o pacote NuGet
Microsoft.Extensions.Compliance.Redaction
para cada projeto. - Adicione o serviço de redação ao contêiner de injeção de dependência.
- Habilite a redação na estrutura de registros.
- Chame a estrutura de registros durante o processo de ordem.
- Adicione uma implementação de redação personalizada para dados EUII.
- Escolha qual implementação de redação usar para cada tipo de dados classificados.
Adicionar o serviço de redação
Você ainda deve abrir o codespace ou a janela do Visual Studio Code. Caso contrário, abra-o agora.
Insira este comando na janela TERMINAL:
cd /workspaces/mslearn-dotnet-cloudnative/dotnet-compliance/eShopLite/Store/
Adicione o pacote NuGet
Microsoft.Extensions.Compliance.Redaction
ao projeto:dotnet add package Microsoft.Extensions.Compliance.Redaction
No painel EXPLORER, expanda a pasta dotnet-compliance/eShopLite/Store e selecione o arquivo Program.cs.
No editor, adicione as seguintes dependências:
using Microsoft.Extensions.Compliance.Classification; using Microsoft.Extensions.Compliance.Redaction;
Role para baixo até a linha 19 e adicione o serviço de redação ao contêiner de injeção de dependência no comentário
Add redaction
:builder.Services.AddRedaction();
Habilitar a redação na estrutura de registros
No editor, adicione este código abaixo da linha
AddRedaction()
:builder.Services.AddLogging(logging => { logging.EnableRedaction(); logging.AddJsonConsole(); //Enable structure logs on the console to view the redacted data. });
O código acima habilita a redação na estrutura de registros.
Chamar a estrutura de registros durante o processo de ordem
No painel EXPLORER, expanda a pasta dotnet-compliance/eShopLite/Store/Services e selecione o arquivo ProductService.cs.
No editor, na parte inferior do arquivo, adicione este código:
public static partial class Log { [LoggerMessage(1, LogLevel.Information, "Placed Order: {order}")] public static partial void LogOrders(this ILogger logger, [LogProperties] Order order); }
No editor, na tarefa
CreateOrder
, chame o métodoLogOrders
:public async Task<bool> CreateOrder(Order order) { try { _logger.LogOrders(order);
O código acima chama o método
LogOrders
e passa as informações de ordem atuais.
Testar o novo registro em log redigido
Com todo o código acima em vigor, o aplicativo pode usar a implementação de redação padrão para redigir as informações de Order
. Agora você vai testar isso.
Na parte inferior do painel TERMINAL, vá para a pasta dotnet-compliance/eShopLite.
cd ..
Atualize os contêineres de aplicativos.
dotnet publish /p:PublishProfile=DefaultContainer
Vá para a pasta dotnet-compliance e inicie o aplicativo com o Docker:
cd .. docker compose up
Selecione a guia PORTAS e, em seguida, selecione o ícone de globo Abrir do Navegador para a porta Front-End (32000).
Selecione o link Produtos. Adicione alguns produtos à sua cesta de compras.
Selecione o botão Comprar Cesta.
Na janela TERMINAL, pressione Ctrl+F, no campo de pesquisa, insira "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":""}}
Você deve ver essa entrada de log formatada em JSON. Observe que o valor order.Total está nos logs, mas os valores CustomerName e CustomerAddress são cadeias de caracteres vazias.
Por padrão, se você não especificar uma implementação de redação, o mecanismo de redação usará a implementação
ErasingRedactor
para garantir que nenhum dado confidencial seja vazado nos logs.Na janela TERMINAL, pressione Ctrl+C para interromper o aplicativo.
Adicionar uma implementação de redação personalizada
Agora, você aprimorará a implementação da redação para usar diferentes algoritmos de redação para diferentes tipos de dados. Primeiro, você adicionará uma nova implementação de redação personalizada que substitui o valor por *****
.
No painel EXPLORER, expanda a pasta dotnet-compliance/eShopLite/DataEntities e selecione o arquivo Compliance.cs.
No editor, na parte inferior do arquivo, adicione este código:
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; } }
O código acima disponibiliza um método de redação
EShopCustomRedactor
para o mecanismo de redação.
Escolher qual implementação de redação usar
No painel EXPLORER, expanda a pasta dotnet-compliance/eShopLite/Store e selecione o arquivo Program.cs.
Substitua o código
builder.Services.AddRedaction();
para fornecer a configuração do mecanismo de redação:builder.Services.AddRedaction(configure => { configure.SetRedactor<ErasingRedactor>(new DataClassificationSet(DataClassifications.EUPDataClassification)); configure.SetRedactor<EShopCustomRedactor>(new DataClassificationSet(DataClassifications.EUIIDataClassification)); });
O código acima configura o mecanismo de redação para usar especificamente a implementação
ErasingRedactor
para dados EUP e a nova implementaçãoEShopCustomRedactor
personalizada para dados EUII.
Testar a nova implementação de redação
Na janela TERMINAL, crie e execute o aplicativo:
docker-compose up --build
Selecione a guia PORTAS e, em seguida, selecione o ícone de globo Abrir do Navegador para a porta Front-End (32000).
Selecione o link Produtos. Adicione alguns produtos à sua cesta de compras.
Selecione o botão Comprar Cesta.
Na janela TERMINAL, pressione Ctrl+F, no campo de pesquisa, insira "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":""}}
Você deve ver essa entrada de log formatada em JSON. Observe que o valor order.Id ainda é uma cadeia de caracteres vazia, mas os valores CustomerName e CustomerAddress agora são
*****.
Na janela TERMINAL, pressione Ctrl+C para interromper o aplicativo.