Partilhar via


O log HttpClientFactory reedita valores de cabeçalho por padrão

HttpClientFactoryO log padrão do inclui Tracelogs 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.

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

APIs afetadas