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