Microsoft.IdentityModel.JsonWebTokens cria e valida JWTs com JsonWebTokenHandler e um objeto TokenValidationParameters; o AddJwtBearer do ASP.NET Core passa as requisições por ele, o que faz dos seus padrões os padrões da maioria das APIs .NET. A versão 8.23.0 assinou e validou as famílias HS, RS, PS e ES; não existe no pacote um tipo de chave de segurança para EdDSA.
ValidAlgorithms é null por padrão, e a chave decide: um token RS256 e um token HS256 forjado com o texto PEM da chave EC falharam, ambos, contra uma chave EC com IDX10517: Signature validation failed. Tokens sem assinatura falham com IDX10504, a menos que RequireSignedTokens seja definido como false. A brecha está na vinculação à curva: o handler assinou ES256 com uma chave P-384, e o mesmo handler validou o token resultante, algo que outras bibliotecas — jose, PyJWT, golang-jwt — recusam. Defina ValidAlgorithms e use chaves do tamanho certo, como faz o exemplo.
As regras de validade são o oposto das da maioria das bibliotecas: exp é obrigatória (IDX10225) e TokenValidationParameters.DefaultClockSkew é de cinco minutos, então um token continua funcionando por até cinco minutos depois de expirar. Isso é generoso para tokens de acesso de vida curta; defina ClockSkew explicitamente. CreateToken adiciona exp mesmo quando Expires não é definido.
As assinaturas ES256 são o r‖s bruto de 64 bytes que o JWS exige, o mesmo padrão do próprio ECDsa do .NET; uma assinatura DER falha com o mesmo IDX10517 de uma assinatura forjada. As mensagens de erro ocultam o conteúdo do token como [PII of type ... is hidden], a menos que IdentityModelEventSource.ShowPII seja habilitado durante a depuração — em vez disso, decodifique o token no depurador de JWT e confira as chaves de um provedor com o verificador de JWKS.