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.
Acción recomendada
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));