HttpClientFactory che registra i valori di intestazione per impostazione predefinita
La registrazione predefinita di HttpClientFactory
include log di livello Trace
che generano tutte le intestazioni di richiesta e risposta. Il metodo RedactLoggedHeaders consente di specificare quali di queste intestazioni sono sensibili. I valori di tali intestazioni non vengono registrati (i nomi delle intestazioni rimangono, ma i valori vengono sostituiti con *
). In precedenza, se nessuna delle intestazioni veniva specificata come sensibile con RedactLoggedHeaders
, tutte le intestazioni venivano considerate non sensibili e registrate con tutti i relativi valori così come erano. A partire da .NET 9, a meno che non venga specificato, tutte le intestazioni vengono considerate sensibili e tutti i valori vengono elaborati per impostazione predefinita.
Comportamento precedente
In precedenza, se RedactLoggedHeaders non veniva chiamato, tutte le intestazioni venivano registrate così come erano. Se veniva chiamato RedactLoggedHeaders
, le intestazioni specificate venivano elaborate e altre intestazioni venivano registrate così come erano.
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) Impostazione predefinita: non modificato
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) Modificato con predicato
trce: System.Net.Http.HttpClient.redacted-predicate.ClientHandler[102]
Request Headers:
Authorization: *
X-Sensitive: *
X-Other: *
Cache-Control: no-cache
(3) Modificato con raccolta
trce: System.Net.Http.HttpClient.redacted-collection.ClientHandler[102]
Request Headers:
Authorization: *
X-Sensitive: *
X-Other: some, other, values
Cache-Control: no-cache
Nuovo comportamento
A partire da .NET 9, se RedactLoggedHeaders non viene chiamato, tutte le intestazioni vengono elaborate. Se RedactLoggedHeaders
viene chiamato, le intestazioni specificate vengono elaborate.
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) Impostazione predefinita: tutti vengono modificati
trce: System.Net.Http.HttpClient.default.ClientHandler[102]
Request Headers:
Authorization: *
X-Sensitive: *
X-Other: *
Cache-Control: *
Versione introdotta
.NET 9 RC 1
Tipo di modifica che causa un'interruzione
Questa è una modifica funzionale.
Motivo della modifica
Se le intestazioni non vengono specificate come sensibili, le informazioni riservate possono essere esposte nei log. Questa modifica rende la registrazione sicura per impostazione predefinita.
Azione consigliata
Per registrare le intestazioni, valutare quali intestazioni possono contenere informazioni riservate e specificarle in modo esplicito usando l'API RedactLoggedHeaders
. È possibile modificare le intestazioni per ogni client o a livello globale per tutti i client usando ConfigureHttpClientDefaults(IServiceCollection, Action<IHttpClientBuilder>).
È consigliabile usare un approccio "allow-list" anziché un approccio "block-list".
Se si ritiene che nessuna delle intestazioni possa contenere informazioni riservate, o per scopi di debug interni, è possibile disabilitare completamente l'operazione di rollforward passando un delegato che restituisce 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));