Saltar al contenido principal

Autenticación y Sesión

Visión General

LCS utiliza NextAuth.js v5 con estrategia JWT para autenticación. No se utilizan sesiones en base de datos — toda la información de sesión viaja en un token JWT firmado dentro de una cookie HTTP-only.

Flujo de Login

JWT Token — Contenido

El token JWT contiene toda la información necesaria para evaluación de permisos sin consultar la base de datos:

ClaimTipoDescripción
idstringID único del usuario (AspNetUsers.Id)
userNamestringNombre de usuario para login
namestringNombre completo para mostrar
rolestringRol principal (Admin/Supervisor/Ejecutivo)
permissionsstring[]Array de permisos efectivos resueltos
lastActivitynumberTimestamp de última actividad (inactivity timeout)
lastPasswordChangedDatestringPara forzar cambio cada 60 días

:::info Sin Datos Sensibles El JWT no contiene contraseñas, datos financieros, ni información personal de deudores. Solo contiene lo mínimo necesario para autenticación y autorización. :::

Control de Sesión

Timeout por Inactividad

Configuración (variables de entorno):

SESSION_INACTIVITY_MINUTES=30 # Timeout por inactividad
SESSION_MAX_AGE_MINUTES=480 # Máximo absoluto (8 horas)

Comportamientos

EventoAcción
Inactividad > 30 minSesión invalidada, redirige a login
Sesión > 8 horasCierre forzado independiente de actividad
Pestaña cerrada y reabiertaSi el cookie persiste y no expiró, continúa
Cambio de permisos por AdminToma efecto en próximo login del usuario

Bloqueo de Cuenta

ParámetroValor
Intentos antes de bloqueo5
Duración del bloqueo5 minutos
Reset del contadorLogin exitoso
aviso

El bloqueo es automático e inapelable. Un administrador no puede desbloquear manualmente antes de los 5 minutos. Si se sospecha un ataque, se recomienda deshabilitar la cuenta desde la administración de usuarios.

Cambio Obligatorio de Contraseña

  • La contraseña debe cambiarse cada 60 días
  • El proxy intercepta TODAS las rutas y redirige si está expirada
  • No se puede acceder a ninguna otra sección hasta completar el cambio
  • El cambio actualiza LastPasswordChangedDate en la DB
  • Las contraseñas se hashean con el algoritmo compatible con ASP.NET Identity

Invalidación de Sesiones Legacy

Las sesiones creadas antes de la implementación del sistema de permisos (sin campo permissions en el token) se invalidan automáticamente:

// En el JWT callback de NextAuth:
if (!Array.isArray(token.permissions)) {
return null // Fuerza re-login
}

Seguridad del Token

AspectoImplementación
AlmacenamientoCookie HTTP-only (no accesible por JavaScript)
TransmisiónSolo HTTPS (Secure flag)
FirmadoHMAC-SHA256 con secret
SameSiteStrict (protección CSRF)
ExpiraciónControlada por maxAge en NextAuth config

Archivos Clave

ArchivoPropósito
src/lib/auth.config.tsConfiguración de NextAuth + tipos de sesión
src/lib/auth.tsProviders, callbacks, resolución de permisos
src/proxy.tsEdge middleware (inactividad, password expiry)
src/app/api/auth/[...nextauth]/route.tsAPI route handler de NextAuth
src/app/(auth)/login/page.tsxPágina de login
src/app/(auth)/change-password/page.tsxPágina de cambio de contraseña