Compartilhar via


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.

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

APIs afetadas