Exercício - Redigir dados confidenciais em aplicativos nativos da nuvem

Concluído

Você precisa adicionar algum registro ao processo de pedido. Você usará os recursos de redação do .NET para garantir que os dados confidenciais não sejam vazados para os logs.

Neste exercício, irá:

  • Adicione o Microsoft.Extensions.Compliance.Redaction pacote NuGet a 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 log.
  • Chame a estrutura de registro durante o processo de pedido.
  • 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 ter o espaço de código ou a janela Código do Visual Studio aberta. Se não, abra-o agora.

  1. Na janela TERMINAL, digite este comando:

    cd /workspaces/mslearn-dotnet-cloudnative/dotnet-compliance/eShopLite/Store/
    
  2. Adicione o Microsoft.Extensions.Compliance.Redaction pacote NuGet ao projeto:

    dotnet add package Microsoft.Extensions.Compliance.Redaction
    
  3. No painel EXPLORER, expanda a pasta dotnet-compliance/eShopLite/Store e selecione o arquivo Program.cs.

  4. No editor, adicione as seguintes dependências:

    using Microsoft.Extensions.Compliance.Classification;
    using Microsoft.Extensions.Compliance.Redaction;
    
  5. Role para baixo até a linha 19, sob o Add redaction comentário adicione o serviço de redação ao contêiner de injeção de dependência:

    builder.Services.AddRedaction();
    

Habilitando a redação na estrutura de registro em log

  1. No editor, adicione este código abaixo da AddRedaction() linha:

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

    O código acima permite a edição na estrutura de log.

Chamar a estrutura de registro durante o processo de pedido

  1. No painel EXPLORER, expanda a pasta dotnet-compliance/eShopLite/Store/Services e selecione o arquivo ProductService.cs.

  2. 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);
    }
    
  3. No editor, na tarefa, chame CreateOrder o LogOrders método:

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

    O código acima chama o LogOrders método e passa a ele as informações de ordem atual.

Testar o novo log editado

Com todo o código acima em vigor, o aplicativo pode usar a implementação de redação padrão para redigir as Order informações. Agora você vai testar isso.

  1. No painel TERMINAL na parte inferior, vá para a pasta dotnet-compliance/eShopLite.

    cd ..
    
  2. Atualize os contêineres de aplicativos.

    dotnet publish /p:PublishProfile=DefaultContainer 
    
  3. Vá para a pasta dotnet-compliance e inicie o aplicativo com o Docker:

    cd ..
    docker compose up
    
  4. Selecione a guia PORTAS e, em seguida, selecione o ícone de globo Abrir no navegador para a porta Front-End (32000).

  5. Selecione o link Produtos . Adicione alguns produtos ao seu carrinho de compras.

  6. Selecione o botão Comprar carrinho de compras .

  7. Na janela TERMINAL, pressione Ctrl+F, no campo de pesquisa digite "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 esta entrada de log formatada em JSON. Observe que a ordem. O valor 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 ErasingRedactor implementação para garantir que nenhum dado confidencial seja vazado para os logs.

  8. Na janela TERMINAL, pressione Ctrl+C para parar o aplicativo.

Adicionar uma implementação de edição personalizada

Agora você aprimorará a implementação de 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 substituirá o valor por *****.

  1. No painel EXPLORER, expanda a pasta dotnet-compliance/eShopLite/DataEntities e selecione o arquivo Compliance.cs.

  2. 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 torna um método de EShopCustomRedactor redação disponível para o mecanismo de redação.

Escolha qual implementação de redação usar

  1. No painel EXPLORER, expanda a pasta dotnet-compliance/eShopLite/Store e selecione o arquivo Program.cs.

  2. Substitua builder.Services.AddRedaction(); o código para fornecer configuração para o 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 ErasingRedactor implementação para dados EUP e a nova implementação personalizada EShopCustomRedactor para dados EUII.

Testar a nova implementação de redação

  1. Na janela TERMINAL, crie e execute o aplicativo:

    docker-compose up --build
    
  2. Selecione a guia PORTAS e, em seguida, selecione o ícone de globo Abrir no navegador para a porta Front-End (32000).

  3. Selecione o link Produtos . Adicione alguns produtos ao seu carrinho de compras.

  4. Selecione o botão Comprar carrinho de compras .

  5. Na janela TERMINAL, pressione Ctrl+F, no campo de pesquisa digite "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 esta entrada de log formatada em JSON. Observe que a ordem. O valor Id ainda é uma cadeia de caracteres vazia, mas os valores CustomerName e CustomerAddress agora são *****.

  6. Na janela TERMINAL, pressione Ctrl+C para parar o aplicativo.