Está en la página 1de 13

Construyendo una Web API REST segura con JSON Web Token en

.NET (Parte II)

En el artículo anterior, vimos la teoría sobre seguridad basada en JWT, pero cómo implementarlo
en .NET de forma correcta, es lo que crea más confusión, ya que en Internet, encontraremos
cientos de tutoriales, algunos confusos y otros incompletos con implementaciones totalmente
distintas que nos llevan a tener muchas dudas.

Requerimientos Previos

Para implementar JWT son necesarios conocimientos de ASP.NET y el siguiente software instalado:

 Visual Studio 2019 IDE


 Gestor de paquetes Nuget
 Servidor web IIS Express
 Web HTTP Debugger: Fiddler, Postman, etc
 ASP.NET MVC y sistema de routing, atributos y filtros
 ASP.NET WEB API Framework y filosofía REST/API

Implementación de JWT

Entrando en materia, partiendo de la base que conocemos JWT y su ciclo de vida, vamos a realizar
un tutorial paso a paso que sea fácil de entender creando un proyecto desde cero.

Recordemos que el ciclo de vida de un Token JWT está representado en este diagrama:
Creación de un proyecto web
 En el menú Archivo, seleccione Nuevo > Proyecto.
 Seleccione la plantilla Aplicación web ASP.NET (.NET Framework) y haga clic en Siguiente.
 Asigne al proyecto el nombre TodoApi y haga clic en Crear.
 En el cuadro de diálogo Crear una aplicación web ASP.NET (.NET Framework). Seleccione
la plantilla API web y haga clic en Crear.
Descargando la librería oficial para Tokens

 En el menú Herramientas, seleccione Administrador de paquetes NuGet > Administrar


paquetes NuGet para la solución.
 Seleccione la pestaña Examinar y escriba System.IdentityModel.Tokens.Jwt en el cuadro
de búsqueda.
 Seleccione System.IdentityModel.Tokens.Jwt en el panel izquierdo.
 Active la casilla Proyecto en el panel derecho y, después, seleccione Instalar.
Creando la estructura WebAPI
Vamos a crear la estructura del API, se recomienda conocer la guía de buenas prácticas API REST y
uso de Visual Studio.

 Haga clic con el botón derecho en la carpeta Controllers y seleccione Agregar >
Controlador
 Seleccione Controlador de Web API 2 – en blanco, seleccione Agregar. Asigne el nombre
LoginController y haga clic en Agregar.
 Crear un segundo Controlador como los pasos anteriores. Asigne el nombre
CustomersController.
 Haga clic con el botón derecho en la carpeta Controllers y seleccione Agregar > Clase.
Asigne a la clase el nombre TokenGenerator y haga clic en Agregar.
 Crear una segunda Clase como los pasos anteriores. Asigne el nombre de la clase
TokenValidationHandler.
 Haga clic con el botón derecho en la carpeta Models y seleccione Agregar > Clase. Asigne
el nombre LoginRequest y haga clic en Agregar.

En este punto, ya hemos creado las clases para nuestro proyecto, evidentemente vacías, como
vemos en la imagen:
Recordar: los controladores WebAPI heredan de "ApiController" y los controladores MVC de
"Controller" en .NET Framework (ojo, en NET Core es diferente).

Implementación del código


Ahora, toca poner código a nuestras clases. Hay muchas formas de realizar esta implementación y
esto es lo que más confusión genera entre los desarrolladores, en nuestro caso, trabajaremos con
estas premisas:

 LoginRequest: clase donde recibiremos las credenciales del usuario.


 IHttpActionResult: para las respuestas HTTP StatusCode al cliente siguiendo filosofía
RESTful.
 [AttributeRoutes]: para decorar las rutas de los controladores del API en cada acción.
 [Authorize]: Decorador para autorizar peticiones válidas al API (necesitará un JWT válido).
 [AllowAnonymous]: Decorador para permitir peticiones anónimas al API (no necesitará un
JWT)
 web.config: Definimos los settings necesarios para nuestro Token JWT.

LoginRequest.cs

 Reemplace el código de plantilla por el código siguiente:

LoginController.cs

 Reemplace el código de plantilla por el código siguiente:


CustomersController.cs

 Reemplace el código de plantilla por el código siguiente:


TokenGenerator.cs

 Reemplace el código de plantilla por el código siguiente:


TokenValidationHandler.cs

 Reemplace el código de plantilla por el código siguiente:


Global.asax

 Reemplace el código de plantilla por el código siguiente:


WebApiConfig.cs

 Reemplace el código de plantilla por el código siguiente:

Web.config

 Reemplace el código de plantilla por el código siguiente:

Comprobando que todo funciona


Una vez tenemos el código listo, vamos a verificar que realmente nuestra API funciona y hace lo
que debe.

Vamos a llamar al LoginController, este encarga de validarnos y enviarnos el Token JWT, y luego,
hacer peticiones al CustomerController enviando el Token JWT.

Recordar que es importante tener los Controller "decorados" correctamente.

 LoginController: no requiere Token porque lo tenemos definido con [AllowAnonymous].


 CustomerController: si requiere Token porque lo tenemos definido con [Authorize].

Pasos para realizar la prueba:

 Ejecutamos la solución para levantar WebAPI en IIS Express


 Abrimos Postman
Paso-1: Realizamos petición GET .../api/login/echoping para verificar que el controlador responde
OK:

Paso-2: Realizamos petición GET .../api/login/echouser para ver si hay algún usuario autenticado:

Paso-3: Realizamos petición POST .../api/login/authenticate para enviar las credenciales y


obtener el Token JWT:
Paso-4: Obtenemos la respuesta POST .../api/login/authenticate con el Token JWT, recordar
"codificado".

Como vemos, ya hemos generado el JWT para el cliente, el cliente deberá enviarnos este token
JWT en las cabeceras de cada petición, con el formato Authorization: Bearer TOKEN_STRING.

Paso-5: Realizamos petición GET .../api/customers para pedir datos de clientes, sin indicar Token
JWT:

En este caso, nuestro API responde con 401 Unauthorized, ya que no hemos recibido ningún
Token:

Paso-6: Realizamos petición GET .../api/customers para pedir datos de clientes, incluyendo Token
JWT:

En este caso, nuestro API responde con 200 OK, ya que hemos enviado el Token JWT:
Recordar, debemos enviar desde el cliente el JWT en las cabeceras de esta forma: Authorization:
Bearer TOKEN_STRING como vemos en la imagen.

Conclusiones Finales
Un Token JWT, es especialmente útil para autenticar y autorizar usuarios para consumir nuestros
servicios del API, ya que, permite la transferencia segura de datos utilizando el poder de la firma
digital y el hash, así como, especificar un tiempo de validez para que el Token caduque.

Además, al trabajar con un protocolo sin estado como REST, tenemos un ahorro de memoria y
acceso a datos considerable, en comparación con el enfoque tradicional: cookies y sesiones para
mantener el estado el cliente y acceso a datos para obtener la información de usuario, roles y
claims.

Es importante remarcar, que la aplicación cliente (web, desktop, móvil), tiene la responsabilidad
de almacenar el JWT en algún sitio seguro, para utilizarlo en todas las llamadas al API, usando las
mejores prácticas según cada plataforma y guías de seguridad.

Por último, no olvidar nunca, siempre debemos publicar nuestro API mediante un certificado
HTTPS para encriptar el contenido entre el servidor y el cliente.

Happy Coding!!

También podría gustarte