La journalisation de HttpClientFactory masque par défaut les valeurs d’en-tête
Le journal par défaut de HttpClientFactory
inclut des journaux de niveau Trace
qui affichent tous les en-têtes de requête et de réponse. La méthode RedactLoggedHeaders vous permet de spécifier lesquels de ces en-têtes sont sensibles. Les valeurs de ces en-têtes ne sont pas journalisées (les noms des en-têtes restent, mais les valeurs sont remplacées par *
). Auparavant, si aucun des en-têtes n’était spécifié comme sensible avec RedactLoggedHeaders
, tous les en-têtes étaient considérés comme non sensibles et étaient journalisés avec toutes leurs valeurs en l’état. À partir de .NET 9, sauf spécification contraire, tous les en-têtes sont désormais considérés comme sensibles et toutes les valeurs sont masquées par défaut.
Comportement précédent
Auparavant, si RedactLoggedHeaders n’était pas appelé, tous les en-têtes étaient journalisés en l’état. Si RedactLoggedHeaders
était appelé, les en-têtes spécifiés étaient masqués, et les autres en-têtes étaient journalisés en l’état.
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) Par défaut : non masqué
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) Masqué avec prédicat
trce: System.Net.Http.HttpClient.redacted-predicate.ClientHandler[102]
Request Headers:
Authorization: *
X-Sensitive: *
X-Other: *
Cache-Control: no-cache
(3) Masqué avec collection
trce: System.Net.Http.HttpClient.redacted-collection.ClientHandler[102]
Request Headers:
Authorization: *
X-Sensitive: *
X-Other: some, other, values
Cache-Control: no-cache
Nouveau comportement
À partir de .NET 9, si RedactLoggedHeaders n’est pas appelé, tous les en-têtes sont masqués. Si RedactLoggedHeaders
est appelé, les en-têtes spécifiés sont masqués.
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) Par défaut : tous sont masqués
trce: System.Net.Http.HttpClient.default.ClientHandler[102]
Request Headers:
Authorization: *
X-Sensitive: *
X-Other: *
Cache-Control: *
Version introduite
.NET 9 RC 1
Type de changement cassant
Ce changement est un changement de comportement.
Raison du changement
Si les en-têtes ne sont pas spécifiés comme sensibles, des informations sensibles peuvent être exposées dans les journaux. Ce changement rend la journalisation sûre par défaut.
Action recommandée
Si vous souhaitez journaliser les en-têtes, évaluez quels en-têtes peuvent contenir des informations sensibles et spécifiez-les explicitement en utilisant l’API RedactLoggedHeaders
. Vous pouvez masquer les en-têtes par client, ou globalement pour tous les clients en utilisant le ConfigureHttpClientDefaults(IServiceCollection, Action<IHttpClientBuilder>).
Envisagez d’utiliser une approche de "liste d’autorisation" plutôt qu’une approche de « liste de blocage ».
Si vous croyez fermement qu’aucun de vos en-têtes ne contient d’informations sensibles, ou à des fins de débogage interne, vous pouvez désactiver complètement le masquage en passant un délégué qui retourne 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));