依預設,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
中斷性變更的類型
此變更為行為變更。
變更原因
如果未將標頭指定為,則可以在記錄中公開敏感性資訊。 根據預設,這項變更使記錄變得安全。
建議的動作
如果要記錄標頭,請評估哪些標頭可能包含敏感性資訊,並使用 RedactLoggedHeaders
API 明確指定它們。 您可以根據用戶端單獨修訂標頭,或透過使用 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));