練習 - 在雲端原生應用程式中修訂機密資料

已完成

您需要將一些記錄新增至訂單流程。 您將使用 .NET 的修訂功能,確保機密資料不會外洩至記錄中。

在本練習中,您將會:

  • Microsoft.Extensions.Compliance.Redaction NuGet 套件新增至每個專案。
  • 將修訂服務新增至相依性插入容器中。
  • 在紀錄架構中啟用修訂。
  • 在訂單流程中呼叫紀錄架構。
  • 新增 EUII 資料的自訂修訂實作。
  • 選擇每個類型的分類資料要使用哪個修訂實作。

新增修訂服務

您仍然應該開啟 codespace 或 Visual Studio Code 視窗。 如果沒有的話,請立即開啟。

  1. 在 [終端] 視窗中輸入此命令:

    cd /workspaces/mslearn-dotnet-cloudnative/dotnet-compliance/eShopLite/Store/
    
  2. Microsoft.Extensions.Compliance.Redaction NuGet 套件新增至專案:

    dotnet add package Microsoft.Extensions.Compliance.Redaction
    
  3. 在 [檔案總管] 窗格中,展開 [dotnet-compliance/eShopLite/Store] 資料夾,然後選取 [Program.cs] 檔案。

  4. 在編輯器中,新增下列相依性:

    using Microsoft.Extensions.Compliance.Classification;
    using Microsoft.Extensions.Compliance.Redaction;
    
  5. 向下捲動至第 19 行,在 Add redaction 註解下,將修訂服務新增至相依性插入容器:

    builder.Services.AddRedaction();
    

在紀錄架構中啟用修訂

  1. 在編輯器中,將這個程式碼新增至 AddRedaction() 行底下:

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

    上述程式碼會在紀錄架構中啟用修訂。

在訂單流程中呼叫紀錄架構

  1. 在 [檔案總管] 窗格中,展開 [dotnet-compliance/eShopLite/Store/Services] 資料夾,然後選取 [ProductService.cs] 檔案。

  2. 在編輯器中,於檔案底部新增此程式碼:

    public static partial class Log
    {
        [LoggerMessage(1, LogLevel.Information, "Placed Order: {order}")]
        public static partial void LogOrders(this ILogger logger, [LogProperties] Order order);
    }
    
  3. 在編輯器的 CreateOrder 工作中,呼叫 LogOrders 方法:

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

    上述程式代碼會呼叫 LogOrders 方法,並傳遞目前的訂單資訊。

測試新的修訂記錄

有了上述所有程式碼後,應用程式即可使用預設的修訂實作,來修訂 Order 資訊。 您現在將測試此作業。

  1. 在底部的 [終端] 窗格中,前往 [dotnet-compliance/eShopLite] 資料夾。

    cd ..
    
  2. 更新應用程式容器。

    dotnet publish /p:PublishProfile=DefaultContainer 
    
  3. 前往 [dotnet-compliance] 資料夾,並使用 Docker 啟動應用程式:

    cd ..
    docker compose up
    
  4. 選取 [連接埠] 分頁,然後選取 [前端 (32000)] 連接埠的 [在瀏覽器中開啟] 地球圖示。

  5. 選取 [產品] 連結。 將一些產品新增至購物籃。

  6. 選取 [購買籃子] 按鈕。

  7. 在 [終端] 視窗中,按 Ctrl+F,在搜尋欄位中輸入 "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":""}}
    

    您應該會看到這個 JSON 格式的記錄項目。 請注意,[order.Total] 值位於記錄中,但 [CustomerName] 和 [CustomerAddress] 值為空白字串。

    根據預設,如果您並未指定修訂實作,則修訂引擎會使用 ErasingRedactor 實作來避免機密資料洩漏至記錄中。

  8. 在 [終端] 視窗中,按 Ctrl+C 即可停止應用程式。

新增自訂修訂實作

您現在會增強修訂實作,以針對不同類型的資料使用不同的修訂演算法。 首先,您將新增自訂修訂實作,將值替換為 *****

  1. 在 [檔案總管] 窗格中,展開 [dotnet-compliance/eShopLite/DataEntities] 資料夾,然後選取 [Compliance.cs] 檔案。

  2. 在編輯器中,於檔案底部新增此程式碼:

    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;
        }
    }
    

    上述程式碼會讓 EShopCustomRedactor 修訂方法可供修訂引擎使用。

選擇要使用的修訂實作

  1. 在 [檔案總管] 窗格中,展開 [dotnet-compliance/eShopLite/Store] 資料夾,然後選取 [Program.cs] 檔案。

  2. 替換 builder.Services.AddRedaction(); 程式碼,以提供修訂引擎的設定:

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

    上述程式碼會將修訂引擎設定為特別針對 EUP 資料使用 ErasingRedactor 實作,並且針對 EUII 資料使用新自訂的 EShopCustomRedactor 實作。

測試新修訂實作

  1. 在 [終端] 視窗中,組建並執行應用程式:

    docker-compose up --build
    
  2. 選取 [連接埠] 分頁,然後選取 [前端 (32000)] 連接埠的 [在瀏覽器中開啟] 地球圖示。

  3. 選取 [產品] 連結。 將一些產品新增至購物籃。

  4. 選取 [購買籃子] 按鈕。

  5. 在 [終端] 視窗中,按 Ctrl+F,在搜尋欄位中輸入 "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":""}}
    

    您應該會看到這個 JSON 格式的記錄項目。 請注意,[order.Id] 值仍然是空白字串,但 [CustomerName] 和 [CustomerAddress] 值現在是 *****.

  6. 在 [終端] 視窗中,按 Ctrl+C 即可停止應用程式。