Microsoft.IdentityModel.JsonWebTokens crea y valida JWT con JsonWebTokenHandler y un objeto TokenValidationParameters; AddJwtBearer de ASP.NET Core hace pasar las solicitudes por él, y por eso sus valores predeterminados son los de la mayoría de las API de .NET. La 8.23.0 firmó y validó las familias HS, RS, PS y ES; el paquete no tiene ningún tipo de clave de seguridad para EdDSA.
ValidAlgorithms es null por defecto, y decide la clave: un token RS256 y un token HS256 falsificado con el texto PEM de la clave EC fallaron ambos contra una clave EC con IDX10517: Signature validation failed. Los tokens sin firmar fallan con IDX10504 salvo que RequireSignedTokens se establezca en false. La carencia está en la vinculación con la curva: se pudo firmar ES256 con una clave P-384 y el mismo controlador validó el token resultante, algo que otras bibliotecas —jose, PyJWT, golang-jwt— rechazan. Configura ValidAlgorithms y usa claves del tamaño adecuado, como hace el ejemplo.
Las reglas de vigencia son las contrarias a las de la mayoría de las bibliotecas: exp es obligatorio (IDX10225) y TokenValidationParameters.DefaultClockSkew es de 5 minutos, así que un token sigue funcionando hasta 5 minutos después de caducar. Es un margen generoso para tokens de acceso de corta duración; configura ClockSkew explícitamente. CreateToken añade exp incluso cuando no se establece Expires.
Las firmas ES256 son el r‖s en bruto de 64 bytes que exige JWS, igual que el valor predeterminado del propio ECDsa de .NET; una firma DER falla con el mismo IDX10517 que una falsificación. Los mensajes de error ocultan el contenido del token como [PII of type ... is hidden] salvo que se active IdentityModelEventSource.ShowPII durante la depuración; en su lugar, decodifica el token en el decodificador de JWT y comprueba las claves de un proveedor con el comprobador de JWKS.