次の方法で共有


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>) を使用して、クライアントごとにヘッダーを編集することも、すべてのクライアントに対してグローバルに編集することもできます。

「ブロック リスト」アプローチではなく、「許可リスト」アプローチの使用を検討してください。

ヘッダーに機密情報が含まれていないと確信している場合、または内部デバッグの目的で、 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