HttpClientFactory-Protokollierung bearbeitet die Headerwerte standardmäßig
Die Standardprotokollierung von HttpClientFactory
enthält Protokolle auf Trace
-Ebene, die alle Anforderungs- und Antwortheader ausgeben. Mit der RedactLoggedHeaders-Methode können Sie angeben, welche dieser Header vertraulich sind. Die Werte dieser Header werden nicht protokolliert (die Headernamen bleiben erhalten, aber die Werte werden ersetzt durch *
). Wenn zuvor keines der Header als vertraulich mit RedactLoggedHeaders
angegeben wurde, wurden alle Header als nicht vertraulich betrachtet und mit allen ihren Werten protokolliert. Ab .NET 9 werden, sofern nicht angegeben, alle Header stattdessen als vertraulich betrachtet, und alle Werte werden standardmäßig bearbeitet.
Vorheriges Verhalten
Wenn RedactLoggedHeaders zuvor nicht aufgerufen wurde, wurden alle Header im Istzustand protokolliert. Wenn RedactLoggedHeaders
aufgerufen wurde, wurden die angegebenen Header bearbeitet, und andere Header wurden im Istzustand protokolliert.
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) Standard – nicht bearbeitet
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) Mit Prädikat bearbeitet
trce: System.Net.Http.HttpClient.redacted-predicate.ClientHandler[102]
Request Headers:
Authorization: *
X-Sensitive: *
X-Other: *
Cache-Control: no-cache
(3) Mit Sammlung bearbeitet
trce: System.Net.Http.HttpClient.redacted-collection.ClientHandler[102]
Request Headers:
Authorization: *
X-Sensitive: *
X-Other: some, other, values
Cache-Control: no-cache
Neues Verhalten
Ab .NET 9 werden alle Header bearbeitet, wenn RedactLoggedHeaders nicht aufgerufen werden. Wenn RedactLoggedHeaders
aufgerufen wird, werden die angegebenen Header bearbeitet.
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) Standard – alle sind bearbeitet
trce: System.Net.Http.HttpClient.default.ClientHandler[102]
Request Headers:
Authorization: *
X-Sensitive: *
X-Other: *
Cache-Control: *
Eingeführt in Version
.NET 9 RC 1
Typ des Breaking Changes
Diese Änderung ist eine Verhaltensänderung.
Grund für die Änderung
Wenn Header nicht als vertraulich angegeben werden, können vertrauliche Informationen in Protokollen verfügbar gemacht werden. Durch diese Änderung wird die Protokollierung standardmäßig sicher.
Empfohlene Maßnahme
Wenn Sie die Header protokollieren möchten, bewerten Sie, welche Header vertrauliche Informationen enthalten können, und geben Sie sie explizit mithilfe der RedactLoggedHeaders
-API an. Sie können Header pro Client oder global für alle Clients mithilfe der ConfigureHttpClientDefaults(IServiceCollection, Action<IHttpClientBuilder>) bearbeiten.
Erwägen Sie die Verwendung eines „Positivliste“-Ansatzes anstelle eines „Blockliste“-Ansatzes.
Wenn Sie mit Sicherheit wissen, dass keines der Header vertrauliche Informationen enthalten kann, oder für interne Debugzwecke, können Sie die Bearbeitung vollständig deaktivieren, indem Sie eine Stellvertretung übergeben, die false
zurückgibt.
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));