Cómo eliminar información sensible del registro predeterminado de HttpClient de C#
Escenario
Llamo a un servicio externo usando un token de acceso, que debe ser proporcionado como un parámetro de consulta llamado token.
Salida del registro
Al hacer una solicitud GET desde C#, veo este registro (el token real se reemplaza por eyJ0… en este ejemplo):
[17:53:07 INF] Comenzando a procesar la solicitud HTTP GET https://example.com/auth?token=eyJ0...
[17:53:07 INF] Enviando solicitud HTTP GET https://example.com/auth?token=eyJ0...
[17:53:07 INF] Recibiendo encabezados de respuesta HTTP después de 140.3618ms - 200
[17:53:07 INF] Finalizando el procesamiento de la solicitud HTTP después de 142.3193ms - 200
¿Cambiar el registro?
¿Existe una manera fácil de usar un controlador de registro personalizado obligatorio para el HttpClient/HttpClientfactory de tal manera que el parámetro de consulta del token se reemplace por ***?
Como:
[17:53:07 INF] Comenzando a procesar la solicitud HTTP GET https://example.com/auth?token=***
Nota 1:
Este código está dentro de una biblioteca, por lo que cambiar el nivel de registro para el HttpClient/HttpClientfactory en el appsettings.json no es una opción. Debe ser seguro.
Nota 2:
Registro el HttpClient / RestEase de la siguiente manera:
csharp
services
.AddTransient<IMyClient, MyClient>()
.AddHttpClient(options.HttpClientName, c => c.BaseAddress = options.ConnectUrl)
.AddPolicyHandler((serviceProvider, request) => HttpClientRetryPolicies.GetPolicy(serviceProvider))
.UseWithRestEaseClient
;
davy.ai
Sí, es posible utilizar un controlador de registro personalizado obligatorio para el HttpClient/HttpClientFactory de tal manera que el parámetro de consulta del token sea reemplazado por ***.
Puede crear un controlador de registro personalizado que intercepte la solicitud y reemplace el parámetro de consulta del token por *** antes de registrarlo. Este controlador puede ser registrado con el HttpClient/HttpClientFactory usando el método AddHttpMessageHandler.
Por ejemplo:
csharp()()
services
.AddTransient<IMyClient, MyClient>()
.AddHttpClient(options.HttpClientName, c => c.BaseAddress = options.ConnectUrl)
.AddPolicyHandler((serviceProvider, request) => HttpClientRetryPolicies.GetPolicy(serviceProvider))
.AddHttpMessageHandler
.UseWithRestEaseClient
;
La clase MyCustomLoggingHandler debe implementar la clase DelegatingHandler y anular el método SendAsync. En este método, puede interceptar la solicitud y reemplazar el parámetro de consulta del token por *** antes de registrarlo.