Значения заголовков журнала 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));