Construyendo Una Web API REST Segura Con JSON Web Token en .NET (Parte II)
Construyendo Una Web API REST Segura Con JSON Web Token en .NET (Parte II)
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:
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
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).
LoginRequest.cs
LoginController.cs
Web.config
Vamos a llamar al LoginController, este encarga de validarnos y enviarnos el Token JWT, y luego,
hacer peticiones al CustomerController enviando el Token JWT.
Paso-2: Realizamos petición GET .../api/login/echouser para ver si hay algún usuario autenticado:
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!!