共用方式為


依預設,HttpClientFactory 記錄會修訂標頭值

HttpClientFactory 的預設記錄包含輸出所有要求和回應標頭的 Trace- 層級記錄。 RedactLoggedHeaders 方法可讓您指定其中哪一個標頭是敏感性的。 這些標頭的值不會被記錄 (標頭名稱會保留,但值會被 * 取代)。 如果先前沒有任何標頭被指定為具 RedactLoggedHeaders 敏感性,所有標頭都被視為非敏感性,並且以原樣記錄了所有值。 從 .NET 9 開始,除非指定,否則所有標頭都會視為敏感性,而且預設會修訂所有值。

先前的行為

先前,如果未呼叫 RedactLoggedHeaders,則會依原樣記錄所有標頭。 如果已呼叫 RedactLoggedHeaders,則會修訂指定的標頭,並依原樣記錄其他標頭。

services.AddHttpClient("default", ...); // 1

services.AddHttpClient("redacted-predicate", ...) // 2
    .RedactLoggedHeaders(h => h.StartsWith("Auth") || h.StartsWith("X-"));

services.AddHttpClient("redacted-collection", ...) // 3
    .RedactLoggedHeaders(new[] { "Authorization", "X-Sensitive", });

(1) 預設 — 未修訂

trce: System.Net.Http.HttpClient.default.ClientHandler[102]
      Request Headers:
      Authorization: NTLM blob
      X-Sensitive: some, secret, values
      X-Other: some, other, values
      Cache-Control: no-cache

(2) 以述詞修訂

trce: System.Net.Http.HttpClient.redacted-predicate.ClientHandler[102]
      Request Headers:
      Authorization: *
      X-Sensitive: *
      X-Other: *
      Cache-Control: no-cache

(2) 以集合修訂

trce: System.Net.Http.HttpClient.redacted-collection.ClientHandler[102]
      Request Headers:
      Authorization: *
      X-Sensitive: *
      X-Other: some, other, values
      Cache-Control: no-cache

新的行為

從 .NET 9 開始,如果未呼叫 RedactLoggedHeaders,則會修訂所有標頭。 如果已呼叫 RedactLoggedHeaders,則會修訂指定的標頭。

services.AddHttpClient("default", ...); // 1 <--- CHANGED

services.AddHttpClient("redacted-predicate", ...) // 2 <--- remains the same
    .RedactLoggedHeaders(h => h.StartsWith("Auth") || h.StartsWith("X-"));

services.AddHttpClient("redacted-collection", ...) // 3 <--- remains the same
    .RedactLoggedHeaders(new[] { "Authorization", "X-Sensitive", });

(1) 預設 — 全部都會修訂

trce: System.Net.Http.HttpClient.default.ClientHandler[102]
      Request Headers:
      Authorization: *
      X-Sensitive: *
      X-Other: *
      Cache-Control: *

導入的版本

.NET 9 RC 1

中斷性變更的類型

此變更為行為變更

變更原因

如果未將標頭指定為,則可以在記錄中公開敏感性資訊。 根據預設,這項變更使記錄變得安全。

如果要記錄標頭,請評估哪些標頭可能包含敏感性資訊,並使用 RedactLoggedHeadersAPI 明確指定它們。 您可以根據用戶端單獨修訂標頭,或透過使用 ConfigureHttpClientDefaults(IServiceCollection, Action<IHttpClientBuilder>) 全域地為所有用戶端修訂標頭。

請考慮使用「允許清單」方法,而不是「封鎖清單」方法。

如果您堅信標頭中沒有任何標頭可以包含敏感性資訊,或為了進行內部偵錯,您可以傳遞傳回 false的委派,完全停用修訂。

private static readonly string[] SafeToLogHeaders = ....;
private static readonly string[] SuperSecretHeaders = ....;

// Specify for all clients.
services.ConfigureHttpClientDefaults(b =>
    b.RedactLoggedHeaders(h =>
        Array.IndexOf(SafeToLogHeaders, h) == -1)); // log values only for SafeToLogHeaders

// "globally" specified RedactLoggedHeaders can be overriden per-name.
// NOTE: RedactLoggedHeaders completely replaces the previously specified check.
services.AddHttpClient("override")
    .RedactLoggedHeaders(SuperSecretHeaders); // log all values except SuperSecretHeaders

// -OR-

// (dangerous) Disable header value redaction for all clients.
services.ConfigureHttpClientDefaults(b => b.RedactLoggedHeaders(_ => false));

受影響的 API