Added in Unreleased.
ZeeKayDa.Auth publishes the signing keys relying parties need to validate token signatures as a JSON Web Key Set, as defined by RFC 7517 Section 5. The endpoint’s URL is published as jwks_uri in the discovery document.
Endpoint URL
Method: GET
Route:
- Default:
{issuer}/connect/jwks - Override: the exact URI configured in
JwksEndpoint.Uri
The route is constrained to the configured issuer host. A request for the same path on a different host is not handled by ZeeKayDa.Auth. Requests over HTTP are rejected at request time with 421 Misdirected Request; loopback HTTP is permitted only when AllowInsecureIssuer is enabled. The endpoint requires no authentication — the key set is public by design and contains only public key material — and it opts out of any host-wide authorization fallback policy so it stays readable in hardened hosts.
Examples:
- Issuer:
https://id.example.com
JWKS URL:https://id.example.com/connect/jwks - Issuer:
https://id.example.com/tenant-a
JWKS URL:https://id.example.com/tenant-a/connect/jwks
Response
The response is the signing key ring’s published key set — every configured slot (Previous/Current/Next), in that order. Only the Current slot’s key ever signs; Previous and Next appear so relying parties can validate tokens signed before a rotation and pre-fetch the key that signs after the next one.
Each JWK carries exactly these members:
| Member | Value |
|---|---|
kid | The RFC 7638 SHA-256 thumbprint of the key’s public material — the same kid issued tokens carry in their JOSE header |
kty | RSA or EC |
use | sig |
alg | The key’s RFC 7518 algorithm identifier (RS256, ES256, …) |
n, e | RSA keys: modulus and exponent, minimally encoded per RFC 7518 §6.3.1.1 |
crv, x, y | EC keys: curve name and point coordinates per RFC 7518 §6.2.1 |
No private key component is ever present, and the response is byte-identical across requests for as long as the configured key set is unchanged.
Example:
{
"keys": [
{
"kid": "NzbLsXh8uDCcd-6MNwXF4W_7noWXFZAfHkxZsRGC9Xs",
"kty": "RSA",
"use": "sig",
"alg": "RS256",
"n": "0vx7agoebGcQSuuPiLJXZptN9nnd...",
"e": "AQAB"
}
]
}
Response headers
| Header | Value |
|---|---|
Content-Type | application/jwk-set+json |
Cache-Control | public, max-age=3600, must-revalidate by default; no-store when JwksEndpoint.CacheMaxAge is below one second |
Access-Control-Allow-Origin | * when JwksEndpoint.CorsOrigins is empty; the matching allowlist entry (plus Vary: Origin) otherwise |
JwksEndpoint.CacheMaxAge governs how long a relying party may keep trusting a cached key set — including a key that has since been removed from configuration. See JwksEndpoint for the configuration details.