Saltar al contenido principal

Autenticacion

Archivo: authentication.md


Esquema de Autenticación (JWT Bearer)

El esquema de seguridad de la API se basa en la autenticación sin estado (stateless) mediante JSON Web Tokens (JWT).

  1. Mecanismo: La API utiliza JSON Web Tokens (JWT) para la autenticación sin estado (stateless).
  2. Protocolo: Se implementa el esquema Bearer (portador) donde el token se envía en el encabezado Authorization.
  3. Implementación: Se utiliza ASP.NET Core Identity para la gestión de usuarios y contraseñas (hashing), y el middleware JWT Bearer para la validación del token.

Configuracion del servidor

Esta sección describe los componentes clave que habilitan la seguridad en el backend.

  1. Clases de Identity
  • ApplicationUser y ApplicationRole: Tipos personalizados de Identity que usan una clave Guid y se mapean a las tablas AspNetUsers y AspNetRoles.
    • Herencia: IdentityUser<Guid> / IdentityRole<Guid>.
  1. Configuracion en Program.cs
  • Servicios de Identity: builder.Services.AddIdentity<ApplicationUser, ApplicationRole> con la configuración de la complejidad de la contraseña
  • Servicios JWT: Configuración del middleware AddJwtBearer y sus parámetros de validación:
    • Validacion Critica: Se requiere que el Issuer, Audience, Lifetime y Signing Key sean validados.
    • Secret Key: Obtenida de appsettings.json.
  1. Servicio de Tokens (TokenService)
    • Responsabilidad: Creación del JWT.
    • Contenido del Token (Claims): El token incluye la identidad necesaria para la autorización:
      • ID de Usuario: (ClaimTypes.NameIdentifier)
      • Email: (ClaimTypes.Email)
      • Roles (ClaimTypes.Role)

Flujo de Autenticación Paso a Paso

PasoAcción del ClienteAcción del Servidor (API)
1. SolicitudEnvía credenciales (Email/Password) al endpoint POST /api/auth/login.El AuthController recibe el LoginRequest.
2. VerificaciónN/AEl UserManager busca el usuario (FindByEmailAsync) y verifica la contraseña (CheckPasswordAsync).
3. GeneraciónN/ASi la verificación es exitosa, el TokenService genera y firma un JWT utilizando la clave secreta del servidor.
4. RespuestaRecibe la respuesta HTTP 200 OK.La API devuelve el JWT (junto con el ID de usuario y roles) dentro del cuerpo del AuthResponse.

Uso del Token (Acceso a Recursos)

Para acceder a métodos protegidos, el cliente debe incluir el token en cada solicitud.

  • Acceso a metodos protegidos
    • Método: Todas las solicitudes a endpoints protegidos ([Authorize]) deben incluir el token.
    • Encabezado: El cliente debe añadir el encabezado Authorization con el prefijo "Bearer" y el token:
      Authorization: Bearer <El.Token.Completo.Aquí>
    • Validación: El middleware JWT Bearer intercepta el encabezado, valida la firma, verifica la expiración, y extrae los claims para poblar el objeto HttpContext.User (el ClaimsPrincipal).
      • Si la validación falla (token expirado, firma inválida), la respuesta es HTTP 401 Unauthorized.

Especificación de Endpoints de Autenticación

Detalle de los endpoints disponibles para la gestión de acceso de usuarios.

  1. Registro (POST /api/auth/register)
ParámetroTipoDescripciónRequerido
emailstringCorreo electrónico único del usuario.
passwordstringContraseña del usuario (sujeta a las políticas de complejidad).
firstNamestringPrimer nombre del usuario.
lastNamestringApellido paterno.
secondLastNamestringApellido materno (opcional en algunos sistemas).

Respuestas

CódigoDescripciónCuerpo de Respuesta (Body)
200 OKRegistro exitoso. Devuelve el token JWT para iniciar la sesión inmediatamente.AuthResponse (incluye Token, UserId, Roles)
400 Bad RequestDatos inválidos o usuario ya existe.Lista de errores de validación de Identity (e.g., contraseña débil, email ya registrado).
  1. Login (POST /api/auth/login)

Permite el inicio de sesión con credenciales válidas.

ParámetroTipoDescripciónRequerido
emailstringCorreo electrónico del usuario.
passwordstringContraseña del usuario.

Respuestas

CódigoDescripciónCuerpo de Respuesta (Body)
200 OKInicio de sesión exitoso.AuthResponse (incluye JWT, UserId, Roles)
401 UnauthorizedCredenciales inválidas (email o contraseña incorrectos).{ "message": "Credenciales inválidas." }

Detalle del Uso y Estructura del JWT

Esta sección amplía cómo se usa el token en el cliente y sus propiedades internas.

  1. Estructura del Token (Claims Clave)

El JWT generado es una cadena codificada que contiene la siguiente información de identidad:

ClaimMapeo C#Descripción
subClaimTypes.NameIdentifierEl ID único del usuario (tipo Guid).
emailClaimTypes.EmailEl correo electrónico del usuario.
roleClaimTypes.Role Uno o varios roles asignados al usuario (e.g., Client, Admin).
expN/ATimestamp de expiración del token.
  1. Inclusión en Peticiones Protegidas
  • Método: Todas las solicitudes a endpoints protegidos ([Authorize]) deben incluir el token.

  • Encabezado: Se debe añadir el encabezado Authorization con el prefijo Bearer y el token:

Authorization: Bearer <El.Token.Completo.Aquí>
  1. Política de Expiración
  • Vigencia: La validez del token se define en la configuración del servidor, bajo la clave JwtSettings:TokenExpirationInMinutes en appsettings.json.
  • Manejo: Una vez expirado, el token resultará en una respuesta HTTP 401 Unauthorized y el usuario deberá volver a iniciar sesión para obtener un nuevo token.