Compartir a través de


El registro de HttpClientFactory oculta los valores de encabezado de forma predeterminada

El registro predeterminado de HttpClientFactory incluye los registros de nivel Trace que generan todos los encabezados de solicitud y respuesta. El método RedactLoggedHeaders permite indicar cuáles de estos encabezados son confidenciales. Los valores de estos encabezados no se registran (los nombres de encabezados se quedan tal cual, pero los valores se sustituyen por *). Anteriormente, si no se ha establecido ninguno de los encabezados como confidencial con RedactLoggedHeaders, todos los encabezados se consideraban no confidenciales y se registraban con todos sus valores tal cual. A partir de .NET 9, a menos que se indique, todos los encabezados se consideran confidenciales y se ocultan todos los valores de forma predeterminada.

Qué pasaba antes

Anteriormente, si no se llamaba a RedactLoggedHeaders, todos los encabezados se registraban tal cual. Si se llamaba a RedactLoggedHeaders, se ocultaban los encabezados especificados y otros encabezados se registraban tal cual.

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) Predeterminado: no oculto

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) Oculto con predicado

trce: System.Net.Http.HttpClient.redacted-predicate.ClientHandler[102]
      Request Headers:
      Authorization: *
      X-Sensitive: *
      X-Other: *
      Cache-Control: no-cache

(3) Oculto con colección

trce: System.Net.Http.HttpClient.redacted-collection.ClientHandler[102]
      Request Headers:
      Authorization: *
      X-Sensitive: *
      X-Other: some, other, values
      Cache-Control: no-cache

Nuevo funcionamiento

A partir de .NET 9, si no se llama a RedactLoggedHeaders, se ocultan todos los encabezados. Si se llama a RedactLoggedHeaders, se ocultan los encabezados especificados.

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) Predeterminado: todos se ocultan

trce: System.Net.Http.HttpClient.default.ClientHandler[102]
      Request Headers:
      Authorization: *
      X-Sensitive: *
      X-Other: *
      Cache-Control: *

Versión introducida

.NET 9 RC 1

Tipo de cambio importante

Este es un cambio de funcionamiento.

Motivo del cambio

Si los encabezados no se consideran confidenciales, la información confidencial se puede exponer en los registros. Este cambio hace que el registro sea seguro de forma predeterminada.

Si desea registrar los encabezados, determine qué encabezados pueden contener información confidencial y márquelos explícitamente mediante la API RedactLoggedHeaders. Puede ocultar encabezados por cliente o de forma global en todos los clientes mediante ConfigureHttpClientDefaults(IServiceCollection, Action<IHttpClientBuilder>).

Tiene la opción de usar un método de "lista de permitidos" en lugar de un método de "lista de bloqueados".

Si cree que ninguno de los encabezados incluye información confidencial o por motivos de depuración internos, puede deshabilitar la ocultación por completo pasando un delegado que devuelva 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 afectadas