O registro em log HttpClientFactory edita valores de cabeçalho por padrão
O log padrão do HttpClientFactory
inclui logs de nível Trace
que geram todos os cabeçalhos de solicitação e resposta. O método RedactLoggedHeaders permite especificar quais desses cabeçalhos são confidenciais. Os valores desses cabeçalhos não são registrados (os nomes dos cabeçalhos permanecem, mas os valores são substituídos por *
). Anteriormente, se nenhum dos cabeçalhos fosse especificado como confidencial com RedactLoggedHeaders
, todos os cabeçalhos eram considerados não confidenciais e eram registrados com todos os seus valores no estado em que se encontram. A partir do .NET 9, a menos que especificado, todos os cabeçalhos são considerados confidenciais e todos os valores são editados por padrão.
Comportamento anterior
Anteriormente, if RedactLoggedHeaders não fosse chamado, todos os cabeçalhos eram registrados no estado em que se encontram. If RedactLoggedHeaders
fosse chamado, os cabeçalhos especificados eram editados e outros cabeçalhos eram registrados no estado em que se encontram.
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) Padrão - não redigido
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) Redigido com predicado
trce: System.Net.Http.HttpClient.redacted-predicate.ClientHandler[102]
Request Headers:
Authorization: *
X-Sensitive: *
X-Other: *
Cache-Control: no-cache
(3) Redigido com coleção
trce: System.Net.Http.HttpClient.redacted-collection.ClientHandler[102]
Request Headers:
Authorization: *
X-Sensitive: *
X-Other: some, other, values
Cache-Control: no-cache
Novo comportamento
A partir do .NET 9, se RedactLoggedHeaders não for chamado, todos os cabeçalhos serão redigidos. Se RedactLoggedHeaders
for chamado, os cabeçalhos especificados serão redigidos.
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) Padrão - todos são redigidos
trce: System.Net.Http.HttpClient.default.ClientHandler[102]
Request Headers:
Authorization: *
X-Sensitive: *
X-Other: *
Cache-Control: *
Versão introduzida
.NET 9 RC 1
Tipo de alteração interruptiva
Esta é uma alteração comportamental.
Motivo da alteração
Se os cabeçalhos não forem especificados como confidenciais, as informações confidenciais poderão ser expostas nos logs. Essa alteração torna o registro em log seguro por padrão.
Ação recomendada
Se você quiser registrar os cabeçalhos, avalie quais cabeçalhos podem conter informações confidenciais e especifique-os explicitamente usando a API RedactLoggedHeaders
. Você pode redigir cabeçalhos por cliente, ou globalmente para todos os clientes, usando o ConfigureHttpClientDefaults(IServiceCollection, Action<IHttpClientBuilder>).
Considere usar uma abordagem de "lista de permissões" em vez de uma abordagem de "lista de bloqueios".
Se você acredita fortemente que nenhum de seus cabeçalhos pode conter informações confidenciais ou para fins de depuração interna, você pode desabilitar a redação completamente passando um delegado que retorna 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));