Quiero construir un SPA (Angular) con un back-end (Asp.Net Core) y quiero usar las mejores prácticas de seguridad. Mi plan es este:
Ahora, aquí es donde me empantano por mi falta de comprensión adecuada.
Número 1: mejores prácticas
¿El procedimiento anterior se considera incluso una mejor práctica? ¿O lo estoy haciendo mal?
Problema 2 - Ticket de autenticación
Mi back-end es solo API, no muestra páginas HTML para el usuario, solo proporciona respuestas Json. ¿Qué tipo de ticket de autenticación debo crear? ¿Debería ser un JWT o una Cookie? Supongo que no puede ser una cookie ya que la API no puede devolver una cookie que el navegador almacenará correctamente. Entonces debe ser algún tipo de token, preferiblemente un JWT. ¿Cómo debe almacenarlo el SPA, almacenamiento local/sesión?
Problema 3: Caducidad y actualización
Suponiendo que el back-end devuelve un JWT al SPA, ¿qué debe contener este JWT? ¿Cuál debería ser su tiempo de caducidad? ¿Cómo debo manejar la actualización automática?
Problema 4 - Paquetes y bibliotecas requeridos
Además, específicamente para la programación (dado que esta es una pregunta de programación después de todo), ¿cuáles son las bibliotecas requeridas para usar para todo esto? La pregunta es tanto para el SPA como para el back-end. Supongo que necesito algún tipo de cliente de conexión abierta para el SPA, y necesito alguna biblioteca en el back-end que pueda completar el flujo del código de autorización (intercambiando el código por el id_token ) ¿Esto lo hace IdentityServer4 ? O hay alguna otra biblioteca.
ACTUALIZAR
He preparado una solución que se esfuerza por mostrar la forma correcta de hacer todo. Es un trabajo en progreso, desordenado y sucio, pero es mínimo, funciona y se esfuerza por seguir las mejores prácticas.
OpenID Connect es un estándar (además de OAuth 2.0) y tiene muchos flujos (usted mencionó un Authorization Code flow , que no es el mejor para SPA.
Se recomendó Implicit flow para aplicaciones SPA, donde SPA recibe tokens directamente del IdP. El flujo implícito está obsoleto ahora y el Authorization Code with PKCE Flow es la mejor opción para SPA en este momento. Esta publicación de blog aleatoria le brindará más detalles sobre estos flujos.
SPA también puede recibir un token de actualización, que se puede usar para obtener un nuevo token de acceso, pero depende del IdP usado.
El backend solo necesita la biblioteca para verificar el token (del encabezado de Authorization de la solicitud), eventualmente necesita verificar algunos reclamos (por ejemplo, el rol) para autorizaciones opcionales. No necesita manejar ningún flujo OIDC, porque se comunica a través del código de respuesta generalmente (200, 401, 403, 500, ...) de regreso a SPA y SPA maneja errores.
En mi humilde opinión, simplemente seleccione la biblioteca adecuada (preferir la certificación OIDC ) para su SPA ( mi favorito para Angular ) y proporcionará muchas características útiles de SPA listas para usar (flujo correcto, actualización de token, almacenamiento de token, interceptor http para llamadas back-end, ... ). Evitaría las bibliotecas proporcionadas por IdP: puede ser una ganancia rápida para la implementación, pero puede ser un bloqueo del proveedor de IdP si brindan alguna funcionalidad fuera del estándar OIDC.