El inicio de sesión único es un estándar consolidado desde hace más de veinte años y, aun así, SAML sigue siendo la línea del presupuesto que frena un acuerdo o dispara una llamada a ventas. Cómo la autenticación empresarial se convirtió en un upsell caro, quién construyó ese mundo y quién nos advirtió sobre él, qué tan ancho es realmente el foso y de qué está hecho, y la única fuerza que en silencio está drenando la mitad.
La monitorización solo se ejecuta durante un desastre. Por eso construimos un banco de pruebas que envía una señal real para cada regla de alerta y solo aprueba cuando la notificación llega físicamente a un relé de captura. La primera ejecución encontró nuestra alerta insignia de tasa de errores muerta, y luego algo peor: un ajuste de retención había marcado en silencio nuestros registros para que expiraran al instante, dejando sin datos a toda una clase de alertas.
Cien megabytes de capturas de pantalla pasaron a Cloudflare R2, detrás de una base de CDN que la app deduce en tiempo de ejecución de su nombre de host. En el navegador todo funcionaba, pero el tráfico del origen no cambió: las páginas que ve un rastreador se prerrenderizan en 127.0.0.1, donde un nombre de host no dice nada. La solución: un marcador que el HTML saca del build y que el edge rellena por petición, obligada por un sistema de archivos de solo lectura.
El aprovisionamiento just-in-time estaba activado por defecto, de modo que un proveedor de identidad federado podía crear cuentas en el tenant de un cliente afirmando que alguien existía. Desactivarlo es un cambio de una sola palabra. Hacerlo sin cambiar en silencio el comportamiento de cada conexión almacenada, ninguna de las cuales escribió jamás la columna, es el verdadero problema, y el truco que lo resolvió explica por qué un valor por defecto es superficie de API.
Un backend-for-frontend saca los tokens de OAuth del navegador y no le deja más que una cookie opaca. Servir a muchos inquilinos desde un solo BFF es sobre todo un problema de fontanería, hasta que llega el cierre de sesión back-channel: un POST de servidor a servidor sin cookie, sin sesión y sin navegador, donde lo único que identifica al inquilino es un claim dentro de un token que aún no has verificado.
Añadimos a nuestro clúster de Kubernetes un webhook de admisión que verifica firmas, para que ninguna imagen sin firmar pudiera ejecutarse jamás. Horas después, un Deployment tenía 2.242 ReplicaSets, uno nuevo cada tres segundos y ningún pod disponible. Los logs del webhook mostraban que admitía todas y cada una de las solicitudes. El daño vino de la única palabra de "mutating admission webhook" que habíamos dejado de leer.
Un usuario recurrente veía "Cargando…" exactamente diez segundos antes de que apareciera el inicio de sesión. El número redondo era la pista: nuestra biblioteca de SSO abría un iframe de renovación silenciosa contra un host de autenticación con X-Frame-Options: DENY y frame-ancestors 'none', así que el iframe nunca cargaba, nunca daba error, y la biblioteca agotaba su tiempo de espera. Defensa contra clickjacking y renovación silenciosa OIDC, ambas correctas, colgadas en la costura entre ambas.
Ciframos todos los emails en reposo y el buscador del panel de administración dejó de autocompletar en silencio: ni un error, ni una línea de log. Un blind index restaura la búsqueda exacta sobre texto cifrado, pero el trabajo de HMAC es destruir el orden que la búsqueda por prefijo necesita. Este es el diseño que devolvió el autocompletado (indexar cada prefijo como un valor propio) y las tres trampas que nos enseñaron que el cifrado con búsqueda es un problema de sistemas, no de criptografía.
Movimos la firma de JWT de RS256 a ES256 y cada token que emitimos era criptográficamente válido, y rechazado. Tres veces, por tres motivos distintos: DER donde JWS espera R‖S en bruto, relleno de enteros que falla un token de cada 128, y un dialecto de base64 que cambió bajo nuestros pies. Aquí explicamos cómo leer los bytes destrozados e identificar la capa culpable solo a partir de la longitud de la firma.
Los dos documentos que un servicio lee para validar uno de nuestros JWT —el documento de discovery y el JWKS— son las cosas más solicitadas y menos secretas que servimos, y antes cada petición volvía hasta el origen. Cachearlos en Cloudflare fue la parte fácil. La parte difícil es que una caché de claves públicas obsoleta jamás debe rechazar un token válido, y aquí tienes el orden a prueba de rotaciones que vuelve seguro un JWKS cacheado de forma agresiva.
El nivel LITE de Duende cuesta $5,750/yr, pero se limita a 2 aplicaciones cliente y no incluye SAML en absoluto. En cuanto necesitas SSO empresarial o una tercera app, pasas a STANDARD por $12,500. Un vistazo a lo que Duende realmente le cuesta a un producto de verdad, y al impuesto por número de clientes del que nadie te advierte.
Una sola clave privada firma todos los tokens que emite nuestro servidor de autenticación, y a lo largo de su vida se ha mudado dos veces: nació dentro del proceso, fue desterrada a una bóveda de la que no puede salir y luego se reencarnó en un tipo de clave completamente distinto, más pequeño y más rápido. Cada mudanza ocurrió en un emisor en producción, con tokens en circulación.
Tu SP validó la firma de la aserción, fijó el certificado y autenticó al usuario. Todas las comprobaciones pasaron. Aun así reproduje un inicio de sesión que capturé hace una hora. El truco no fue romper la firma. Fue borrar un campo que la firma nunca cubría.
Pedíamos el segundo factor en la página de login y nunca lo volvíamos a comprobar en el token endpoint. Así que una contraseña válida más una URL de retorno editada a mano pasaba de largo el MFA. La corrección, y la regla que nos enseñó: el MFA es una propiedad de la sesión que emites, no un paso en la pantalla de login.
SCIM es una API CRUD estandarizada cuyo verbo más importante es el que desactiva la cuenta de un exempleado. Los proveedores la cobran a $125 al mes por conexión, o la aparcan en el nivel enterprise junto al SSO. Esto es lo que realmente cuesta servir una conexión SCIM, y por qué cobrar por el desaprovisionamiento es cobrar por la seguridad.
Azure Table Storage y DynamoDB no tienen marcadores de borrado, así que una fila eliminada simplemente se esfuma, lo que significa que tu backup incremental nunca llega a ver el borrado. Restaura ese backup y el usuario al que diste de baja está de vuelta, con la contraseña que ya habías rotado. Aquí explicamos por qué los borrados tienen que ser de primera clase, y la tabla que los convierte en eso.
Nuestro rate limiter y el contador de bloqueo de cuenta usaban la IP del cliente como clave. Detrás de nginx esa IP venía de un header que el cliente podía fijar, así que un header rotatorio le daba a cada request una IP nueva y todos los controles por IP se venían abajo. El spoof de una línea, y el arreglo que es más enredado de lo que parece en Kubernetes.
Azure Table Storage te da una partition key, una row key y casi nada más. Sin joins, sin secondary indexes que merezcan el nombre, sin incremento. Aun así, ejecutamos sobre él un sistema de autenticación multiinquilino. Los patrones que lo hacen funcionar, y lo que sacrificas frente a SQL.
Un endpoint de restablecimiento de contraseña sin autenticación y sin límite de tasa por correo no es solo tu problema. Apúntalo a la bandeja de entrada de otra persona y habrás convertido tu formulario de restablecimiento en un cañón de spam, facturado a tu reputación de remitente. La solución, sin filtrar qué correos tienen cuenta.
La mayoría de los proveedores de auth encierran SSO, SCIM, MFA y los registros de auditoría detrás de un plan Enterprise. Nosotros los pusimos todos en el plan de $0. Esta es la economía unitaria que hace sostenible regalar funciones: el muro nunca fueron las funciones, son los usuarios activos y el soporte.
El inicio de sesión único implica confiar en el proveedor de identidad. Confiamos en él para una cosa de más: resolvíamos a los usuarios federados recurrentes por el correo de la aserción, de modo que cualquier conexión podía reclamar la dirección de otra persona y aterrizar en su cuenta. La solución no fue más validación, sino cambiar la clave de unión de identidad del correo a un sujeto propio del proveedor que la parte que afirma no puede falsificar.
Azure Container Apps prometía que dejáramos de pagar por un clúster de autenticación inactivo. Calculamos el coste de la migración y la descartamos, no por el precio ni por los arranques en frío, sino porque al serverless le falta el único número que una backplane de autenticación con elección de líder realmente necesita.
El «impuesto a las funciones» como factura real. Tres escenarios de comprador (primer acuerdo enterprise, un puñado de clientes, el SSO ya como requisito básico) calculados frente a las tarifas públicas de cada proveedor. Más el recargo silencioso del que nadie te avisa: quedarte sin clientes OAuth a mitad de integración.
Un clúster de tres réplicas no dejaba de estar en desacuerdo consigo mismo. La causa estaba en nuestro propio código: la rutina de descubrimiento de pares tenía un bloque catch que desactivaba el descubrimiento cuando el multicast fallaba, y en Kubernetes gestionado el multicast siempre falla. Por qué eliminamos el gossip por completo y elegimos un líder con un blob lease, y por qué una pertenencia que abres en Storage Explorer gana a una que tienes que inferir.
El login es un fin de semana. La factura llega después: verificación de firmas, desaprovisionamiento por SCIM, MFA, registros de auditoría, rotación de claves, responsabilidad por brechas y guardia para un sistema de nivel cero. Un análisis honesto de construir o comprar, incluyendo cuándo construir es lo correcto.
¿OIDC o SAML? Rara vez te toca elegir. Qué es cada protocolo, cuándo gana cada uno, las trampas de la firma XML que hacen peligroso implementar SAML a mano y por qué un producto B2B acaba necesitando ambos.
El sistema de soporte de Authagonal: mensajería en tiempo real sin recargar, traducción de IA transparente en ambos sentidos, fijada desde el primer mensaje del cliente, y un hilo que sigue totalmente traducido incluso por correo electrónico. Sencillo, atractivo y de verdad capaz.
Dos de nuestros inquilinos eran, sin que nadie lo supiera, el mismo inquilino: misma base de datos, misma clave de firma de tokens, distintos nombres. La causa fue una función auxiliar de una sola línea que saneaba los slugs eliminando los guiones, convirtiendo un identificador único en uno no único. Aquí te contamos cómo una transformación de cadena con pérdida se convirtió en un secuestro entre inquilinos, y por qué lo encontramos antes que tú.
Vendemos autenticación, así que nuestra prueba más importante es una que se convierte en cliente: una única ejecución de Playwright que registra un inquilino, configura cada función, apunta una app real hacia él, inicia sesión un usuario real con los claims correctos, y luego respalda, restaura y se elimina a sí misma. Cómo unas pruebas de extremo a extremo exhaustivas se ganaron nuestra confianza para salir a producción.
Nuestra consola de personal se autentica a través de la propia Authagonal, con Entra SSO y SCIM encargándose del provisioning. Ser tu propio cliente saca a la luz los casos límite que ninguna suite de pruebas piensa en escribir. Estos son los que importaron.
Tu estado de Terraform es un mapa completo de tu nube más un montón de secretos, y por defecto vive detrás de un endpoint público. Así fue como arrancamos el estado remoto desde cero, lo pusimos detrás de un endpoint privado y llegamos a él a través de un conector de confianza cero en lugar de pagar el impuesto de la pasarela VPN, sin dejarnos jamás fuera.
"Todos restablecen su contraseña" es una decisión de migración, no una ley de la física. Cómo trasladar los hashes de contraseña existentes de tus usuarios en un cambio de proveedor de identidad para que el cambio sea invisible, y el único caso en que de verdad no puedes.
La industria de la autenticación cobra por el permiso, no por el coste. Bloquea el SSO, el MFA y el aprovisionamiento tras niveles y tarifas por conexión, por funciones cuya provisión no cuesta prácticamente nada. Esta es la distinción que las páginas de precios esperan que nunca traces.
Pasar del Duende IdentityServer autoalojado a la autenticación gestionada: qué migra realmente desde la configuración SQL y ASP.NET Identity, y el coste operativo que dejas de cargar.
Una mirada práctica a lo que implica de verdad una migración desde Auth0: qué es fácil, qué es peliagudo y lo único que Auth0 genuinamente no te dará.