Aprende a proteger tus APIs REST y asegura que solo los usuarios correctos accedan a tus recursos.
Son conceptos interrelacionados pero distintos, y fundamentales para la seguridad de cualquier sistema.
Es el proceso de **verificar la identidad** de un usuario. Típicamente se hace con credenciales (usuario y contraseña) o tokens.
Equivale a mostrar tu **documento de identidad** en la puerta de un club. ¡Te identifica!
Es el proceso de **verificar los permisos** que tiene el usuario ya identificado. Se basa en roles (admin, editor) o políticas específicas.
Equivale a ver si tu pase (luego de identificarte) te permite entrar al **área VIP**. ¡Define tus límites!
JWT es el método de facto para manejar la identidad de manera **sin estado (stateless)** en APIs REST, donde el servidor no necesita guardar información de sesión.
Un JWT es una cadena de texto codificada en base64 dividida en tres partes por puntos (`.`):
Una vez que el cliente obtiene el token JWT, lo incluye en cada solicitud subsiguiente (generalmente en el header **Authorization: Bearer [token]**). El servidor puede validar el token usando la Firma, sin tener que consultar una base de datos para verificar la sesión. Esto hace que las APIs sean muy escalables.
// Ejemplo de Claim
"sub": "1234567890" // Sujeto (ID de usuario)
"role": "Admin" // Rol del usuario
ASP.NET Core facilita la integración de JWT a través de middlewares y atributos de autorización.
Después de validar el usuario y contraseña, el Controller de Login utiliza la clave secreta para crear un JWT que contenga las Claims (ID de usuario, roles) y la fecha de expiración.
Usando atributos, podemos restringir el acceso. Los middlewares de .NET se encargan de decodificar y validar la firma del token en cada solicitud.
// Solo usuarios autenticados
[Authorize]
[HttpGet("datos-sensibles")]
// Solo usuarios con el rol 'Admin'
[Authorize(Roles = "Admin")]
[HttpPost("crear-recurso")]
Analiza el propósito de las partes del JWT y cómo se usa la Firma para garantizar la integridad.
Un cliente recibe un JWT. Si un atacante intercepta el token y cambia el campo "role": "User" a "role": "Admin" en el **Payload**, ¿por qué la API REST de ASP.NET Core rechazará el token?
El token será rechazado debido a que la **Firma (Signature)** ya no es válida:
**Conclusión:** El JWT solo es seguro si la **Clave Secreta** del servidor se mantiene oculta.