Digest Authentication en .NET Core 3.x
Introducción
Recientemente me he encontrado con la necesidad de abordar un proyecto en el que he tenido que autenticarme con Digest en .NET Core 3.x.
En esta entrada voy a abordar cómo autenticarse con Digest y HttpClient.
HttpClient, CredentialCache y AuthType
Lo primero que tenemos que tener claro es que va a ser necesario disponer de unas credenciales que nos permitan autenticarnos.
Esas credenciales serán las que arrastremos hasta HttpClient, que será el encargado de gestionar la correspondiente petición.
Dentro de la configuración de las credenciales, deberemos indicar igualmente el tipo de autenticación que vamos a utilizar.
Este tipo de autenticación puede ser de diferentes tipos: NTLM, Kerberos, Negotiate o Digest.
Creando nuestras credenciales
La primera tarea que tendremos que hacer por lo tanto, es configurar nuestras credenciales.
Bastará con tener la URL de autenticación, el usuario y la contraseña.
Nuestro código podría quedar de la siguiente forma:
var credentialCache = new CredentialCache(); credentialCache.Add(uri, "Digest", new NetworkCredential(username, password));
Creando y configurando el handler a utilizar en HttpClient
HttpHandler es utilizado por HttpClient.
Un manejador o handler nos va a permitir configurar diferentes opciones con respecto al comportamiento que HttpClient queremos que tenga.
Nuestro código continuación del anterior, quedará en este caso como se indica a continuación (incluyendo una característica adicional que en mi caso y para que sirva de ejemplo, he querido añadir):
var handler = new HttpClientHandler() { AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate, Credentials = credentialCache };
Instanciar y usar HttpClient
Una vez hecho esto, estaremos preparados para poder llamar a HttpClient con el handler configurado anteriormente junto con sus credenciales de tipo Digest.
Para instanciar HttpClient deberemos escribir el siguiente código:
var httpClient = new HttpClient(handler);
Para utilizar HttpClient deberíamos hacer algo parecido a lo siguiente:
var response = await httpClient.GetAsync(uri); if (response.IsSuccessStatusCode) { // TODO OK } else { // TODO KO }
Algunas anotaciones generales
Como habrás podido apreciar, ha sido necesario indicar el tipo de autenticación con una cadena de texto Digest.
Microsoft tiene esta misma cadena dentro de la clase DigestClient.
El único problema de esta clase es que es una clase internal con una constante internal igualmente con este valor dentro de ella.
Personalmente me hubiera gustado que los tipos de autenticación estuvieran aglutinados dentro de un conjunto de valores globales para evitar errores de escritura (los típicos typing errors), pero es cómo están recogidos por Microsoft.
Resumen final del código
Por lo tanto, y a modo resumen, nuestro código completo quedará de la siguiente forma:
var credentialCache = new CredentialCache(); credentialCache.Add(uri, "Digest", new NetworkCredential(username, password)); var handler = new HttpClientHandler() { AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate, Credentials = credentialCache }; var httpClient = new HttpClient(handler); var response = await httpClient.GetAsync(uri); if (response.IsSuccessStatusCode) { // TODO OK } else { // TODO KO }
Happy Coding!