Microsoft.IdentityModel.JsonWebTokens は、JsonWebTokenHandler と TokenValidationParameters オブジェクトで JWT を作成・検証します。ASP.NET Core の AddJwtBearer はリクエストをこのハンドラーに通すため、そのデフォルトがほとんどの .NET API のデフォルトになります。8.23.0 では HS、RS、PS、ES の各ファミリーで署名と検証ができました。このパッケージには EdDSA 用のセキュリティキーの型はありません。
ValidAlgorithms はデフォルトで null で、その場合は鍵によって決まります。EC 鍵に対しては、RS256 トークンも、EC 鍵の PEM テキストで偽造した HS256 トークンも、IDX10517: Signature validation failed. で失敗しました。署名のないトークンは、RequireSignedTokens を false に設定しない限り IDX10504 で失敗します。足りないのは曲線の結び付けです。P-384 の鍵で ES256 の署名ができ、同じハンドラーはその結果のトークンを検証で受け入れました。jose、PyJWT、golang-jwt といった他のライブラリはこれを拒否します。サンプルのように、ValidAlgorithms を設定し、正しいサイズの鍵を使ってください。
有効期間のルールはほとんどのライブラリと逆です。exp は必須(IDX10225)で、TokenValidationParameters.DefaultClockSkew は 5 分なので、トークンは期限切れ後も最長 5 分間は使えます。有効期間の短いアクセストークンにとってはかなり長い許容時間です。ClockSkew を明示的に設定してください。CreateToken は、Expires を設定しなくても exp を追加します。
ES256 署名は JWS が求める 64 バイトの生の r‖s で、.NET 自身の ECDsa のデフォルトと一致します。DER 署名は、偽造された署名と同じ IDX10517 で失敗します。エラーメッセージでは、デバッグ時に IdentityModelEventSource.ShowPII を有効にしない限り、トークンの内容が [PII of type ... is hidden] として隠されます。代わりに JWT デバッガーでトークンをデコードし、プロバイダーの鍵は JWKS チェッカーで確認してください。