Partager via


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.

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));

API affectées