Поделиться через


Значения заголовков журнала HttpClientFactory по умолчанию

HttpClientFactoryВедение журнала по умолчанию включает Traceжурналы уровня, которые выводит все заголовки запроса и ответа. Этот RedactLoggedHeaders метод позволяет указать, какие из этих заголовков чувствительны. Значения этих заголовков не регистрируются (имена заголовков остаются, но значения заменяются *). Ранее, если ни один из заголовков не был указан как RedactLoggedHeadersконфиденциальный, все заголовки считаются нечувствительными и регистрируются со всеми их значениями как есть. Начиная с .NET 9, если не указано, все заголовки вместо этого считаются конфиденциальными и все значения по умолчанию редактируются.

Прежнее поведение

Ранее, если RedactLoggedHeaders он не был вызван, все заголовки были записаны как есть. При RedactLoggedHeaders вызове указанные заголовки были отредактированы, а другие заголовки регистрировались как есть.

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) По умолчанию — не редактируется

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) Редактирован с предикатом

trce: System.Net.Http.HttpClient.redacted-predicate.ClientHandler[102]
      Request Headers:
      Authorization: *
      X-Sensitive: *
      X-Other: *
      Cache-Control: no-cache

(3) Редактировано с коллекцией

trce: System.Net.Http.HttpClient.redacted-collection.ClientHandler[102]
      Request Headers:
      Authorization: *
      X-Sensitive: *
      X-Other: some, other, values
      Cache-Control: no-cache

Новое поведение

Начиная с .NET 9, если RedactLoggedHeaders не вызывается, все заголовки редактируются. При RedactLoggedHeaders вызове указанные заголовки будут отредактированы.

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) По умолчанию— все они редактируются

trce: System.Net.Http.HttpClient.default.ClientHandler[102]
      Request Headers:
      Authorization: *
      X-Sensitive: *
      X-Other: *
      Cache-Control: *

Представленные версии

.NET 9 RC 1

Тип критического изменения

Это изменение поведения.

Причина изменения

Если заголовки не указаны как конфиденциальные, конфиденциальная информация может быть предоставлена в журналах. Это изменение делает ведение журнала безопасным по умолчанию.

Если вы хотите регистрировать заголовки, оцените, какие заголовки могут содержать конфиденциальную информацию и явно указывать их с помощью RedactLoggedHeaders API. Заголовки можно редактирует на каждого клиента или глобально для всех клиентов с помощью .ConfigureHttpClientDefaults(IServiceCollection, Action<IHttpClientBuilder>)

Рекомендуется использовать подход "allow-list", а не подход "block-list".

Если вы твердо считаете, что ни один из заголовков не может содержать конфиденциальную информацию или для внутренних целей отладки, можно полностью отключить редакт, передав делегат, который возвращает 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));

Затронутые API