Condividi tramite


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.

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

API interessate