O log HttpClientFactory reedita valores de cabeçalho por padrão
HttpClientFactory
O log padrão do inclui Trace
logs de nível que geram todos os cabeçalhos de solicitação e resposta. O RedactLoggedHeaders método 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 sensível com RedactLoggedHeaders
, todos os cabeçalhos eram considerados não confidenciais e eram registrados com todos os seus valores como estão. 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, se RedactLoggedHeaders não fosse chamado, todos os cabeçalhos eram registrados como estão. Se RedactLoggedHeaders
foi chamado, os cabeçalhos especificados foram editados e outros cabeçalhos foram registrados como estão.
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 editado
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 editados. Se RedactLoggedHeaders
for chamado, os cabeçalhos especificados serão editados.
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 editados
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 mudança de rutura
Esta mudança é uma mudança comportamental.
Razão para a 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 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 RedactLoggedHeaders
API. Você pode redigir cabeçalhos por cliente ou globalmente para todos os clientes usando o ConfigureHttpClientDefaults(IServiceCollection, Action<IHttpClientBuilder>).
Considere a possibilidade de utilizar uma abordagem de "lista de permissões" em vez de uma abordagem de "lista de bloqueios".
Se você acredita firmemente que nenhum dos seus cabeçalhos pode conter informações confidenciais, ou para fins de depuração interna, você pode desativar 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));