練習 - 在雲端原生應用程式中修訂機密資料
您需要將一些記錄新增至訂單流程。 您將使用 .NET 的修訂功能,確保機密資料不會外洩至記錄中。
在本練習中,您將會:
- 將
Microsoft.Extensions.Compliance.Redaction
NuGet 套件新增至每個專案。 - 將修訂服務新增至相依性插入容器中。
- 在紀錄架構中啟用修訂。
- 在訂單流程中呼叫紀錄架構。
- 新增 EUII 資料的自訂修訂實作。
- 選擇每個類型的分類資料要使用哪個修訂實作。
新增修訂服務
您仍然應該開啟 codespace 或 Visual Studio Code 視窗。 如果沒有的話,請立即開啟。
在 [終端] 視窗中輸入此命令:
cd /workspaces/mslearn-dotnet-cloudnative/dotnet-compliance/eShopLite/Store/
將
Microsoft.Extensions.Compliance.Redaction
NuGet 套件新增至專案:dotnet add package Microsoft.Extensions.Compliance.Redaction
在 [檔案總管] 窗格中,展開 [dotnet-compliance/eShopLite/Store] 資料夾,然後選取 [Program.cs] 檔案。
在編輯器中,新增下列相依性:
using Microsoft.Extensions.Compliance.Classification; using Microsoft.Extensions.Compliance.Redaction;
向下捲動至第 19 行,在
Add redaction
註解下,將修訂服務新增至相依性插入容器:builder.Services.AddRedaction();
在紀錄架構中啟用修訂
在編輯器中,將這個程式碼新增至
AddRedaction()
行底下:builder.Services.AddLogging(logging => { logging.EnableRedaction(); logging.AddJsonConsole(); //Enable structure logs on the console to view the redacted data. });
上述程式碼會在紀錄架構中啟用修訂。
在訂單流程中呼叫紀錄架構
在 [檔案總管] 窗格中,展開 [dotnet-compliance/eShopLite/Store/Services] 資料夾,然後選取 [ProductService.cs] 檔案。
在編輯器中,於檔案底部新增此程式碼:
public static partial class Log { [LoggerMessage(1, LogLevel.Information, "Placed Order: {order}")] public static partial void LogOrders(this ILogger logger, [LogProperties] Order order); }
在編輯器的
CreateOrder
工作中,呼叫LogOrders
方法:public async Task<bool> CreateOrder(Order order) { try { _logger.LogOrders(order);
上述程式代碼會呼叫
LogOrders
方法,並傳遞目前的訂單資訊。
測試新的修訂記錄
有了上述所有程式碼後,應用程式即可使用預設的修訂實作,來修訂 Order
資訊。 您現在將測試此作業。
在底部的 [終端] 窗格中,前往 [dotnet-compliance/eShopLite] 資料夾。
cd ..
更新應用程式容器。
dotnet publish /p:PublishProfile=DefaultContainer
前往 [dotnet-compliance] 資料夾,並使用 Docker 啟動應用程式:
cd .. docker compose up
選取 [連接埠] 分頁,然後選取 [前端 (32000)] 連接埠的 [在瀏覽器中開啟] 地球圖示。
選取 [產品] 連結。 將一些產品新增至購物籃。
選取 [購買籃子] 按鈕。
在 [終端] 視窗中,按 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
實作來避免機密資料洩漏至記錄中。在 [終端] 視窗中,按 Ctrl+C 即可停止應用程式。
新增自訂修訂實作
您現在會增強修訂實作,以針對不同類型的資料使用不同的修訂演算法。 首先,您將新增自訂修訂實作,將值替換為 *****
。
在 [檔案總管] 窗格中,展開 [dotnet-compliance/eShopLite/DataEntities] 資料夾,然後選取 [Compliance.cs] 檔案。
在編輯器中,於檔案底部新增此程式碼:
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
修訂方法可供修訂引擎使用。
選擇要使用的修訂實作
在 [檔案總管] 窗格中,展開 [dotnet-compliance/eShopLite/Store] 資料夾,然後選取 [Program.cs] 檔案。
替換
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
實作。
測試新修訂實作
在 [終端] 視窗中,組建並執行應用程式:
docker-compose up --build
選取 [連接埠] 分頁,然後選取 [前端 (32000)] 連接埠的 [在瀏覽器中開啟] 地球圖示。
選取 [產品] 連結。 將一些產品新增至購物籃。
選取 [購買籃子] 按鈕。
在 [終端] 視窗中,按 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] 值現在是
*****.
在 [終端] 視窗中,按 Ctrl+C 即可停止應用程式。