Microsoft.IdentityModel.JsonWebTokens creates and validates JWTs with JsonWebTokenHandler and a TokenValidationParameters object; AddJwtBearer in ASP.NET Core feeds requests through it, which makes its defaults the defaults of most .NET APIs. 8.23.0 signed and validated the HS, RS, PS and ES families; there is no EdDSA security key type in the package.
ValidAlgorithms is null by default, and the key decides: an RS256 token and an HS256 token forged with the EC key's PEM text both failed against an EC key with IDX10517: Signature validation failed. Unsigned tokens fail with IDX10504 unless RequireSignedTokens is set to false. The gap is curve binding: ES256 signed with a P-384 key and the same handler validated the resulting token, which other libraries — jose, PyJWT, golang-jwt — refuse. Set ValidAlgorithms and use keys of the right size, as the sample does.
Lifetime rules are the opposite of most libraries: exp is required (IDX10225) and TokenValidationParameters.DefaultClockSkew is five minutes, so a token keeps working for up to five minutes after it expires. That is generous for short-lived access tokens; set ClockSkew explicitly. CreateToken adds exp even when Expires is not set.
ES256 signatures are the 64-byte raw r‖s that JWS requires, matching .NET's own ECDsa default; a DER signature fails with the same IDX10517 as a forgery. Error messages hide token contents as [PII of type ... is hidden] unless IdentityModelEventSource.ShowPII is enabled during debugging — decode the token in the JWT debugger instead, and check a provider's keys with the JWKS checker.