ndovuagent-auth

DRAFT-IETF-OAUTH-IDENTITY-ASSERTION-AUTHZ-GRANT · THE AUTHOR-FACING INDEX

The ID-JAG rules explorer

Every token, metadata, and exchange rule in draft -05 and -04 of Identity Assertion JWT Authorization Grants, grouped by section cite: the normative keyword, what the validator checks, and a deliberately broken example wherever the engine ships a committed negative fixture - rendered at build time from the id-jag-validate engine.

updated October 31, 2026rendered from id-jag-validate at build time

Every rule the validator console evaluates, pinned to the exact section of the draft that requires it. Rows are grouped by section cite so an author can read one section as its own checklist: what the draft demands, which keyword carries the demand, what the engine does about it, and - where a committed negative fixture exists - what a broken grant looks like. Nothing here runs at request time: both rulesets are rendered into this page when the site builds.

Revision banner · -04 → -05 delta

Computed at build time by comparing the two rulesets' rule descriptors (ids, keywords, cites):7 rules added, 8 section cites sharpened,0 removed, 0 keywords re-graded.

The 7 rules -05 adds
  • subid-transient-nameid MUST NOTTransient SAML NameID Formats (such as urn:oasis:names:tc:SAML:2.0:nameid-format:transient) MUST NOT be used: their values change across sessions and cannot serve as a cross-trust-domain identifier.
  • subid-pairwise-mapping MUSTPairwise nameid values MUST be scoped to the Service Provider of the target RAS, with the mapping maintained; needs IdP-side state.
  • metadata-idp-signing-alg MUSTid_jag_signing_alg_values_supported, when present, MUST include RS256.
  • mint-policy-narrowing MAYThe IdP MAY narrow requested resources, scopes, or authorization details by policy.
  • rejection-error-mapping MUSTValidation failures map to invalid_grant; authorization denials map to access_denied.
  • rejection-no-refresh-token SHOULD NOTThe RAS SHOULD NOT return a refresh token on an ID-JAG exchange; the ID-JAG itself is re-submittable.
  • rejection-jti-single-use MAYThe RAS MAY enforce single use by tracking jti and MAY cap exp by policy; replay tracking needs RAS-side state.

Section 3.1

MUSTSection 3.1structurestructure-typ

The JWT header "typ" MUST be "oauth-id-jag+jwt" (explicit typing per RFC 8725 Section 3.11).

run this rule in the validator →

breaks it (typ-wrong): Header typ is wrong; the draft requires oauth-id-jag+jwt.

REQUIREDSection 3.1claimsclaims-required

iss, sub, aud, client_id, jti, exp, and iat are REQUIRED claims of the ID-JAG.

run this rule in the validator →

breaks it (missing-jti): The REQUIRED jti claim is absent.

MUSTSection 3.1claimsclaims-resource-shape

When present, resource is a string or a non-empty JSON array of unique strings (RFC 8707 resource identifiers).

MUSTSection 3.1claimsclaims-authorization-details-shape

When present, authorization_details MUST be a JSON array of authorization detail objects (RFC 9396).

OPTIONALSection 3.1claimsclaims-act-informational

act is OPTIONAL (RFC 8693 Section 4.1); the engine surfaces actor context informationally and never renders a verdict on it.

MUSTSection 3.1semanticssemantics-sub-sub-id-same-user

When both sub and sub_id are present, they MUST identify the same End-User; the engine flags the pair for confirmation.

MUSTSection 3.1semanticssemantics-aud-sub-uniqueness

aud + aud_tenant and aud_sub MUST be unique within the Resource Authorization Server; requires RAS-side state.

Section 3

MUSTSection 3structurestructure-alg

RS256 is mandatory to implement for both authorization servers (Section 5 of RFC 7523), and the Resource AS SHOULD also support ES256; the engine accepts exactly RS256 and ES256 and rejects alg none and every other value as rule outcomes.

Section 4.4.1

MUSTSection 4.4.1structurestructure-signature

The ID-JAG signature MUST be validated against the trusted issuer's keys (from jwks_uri) as required by RFC 7521 Section 5.2.

MUSTSection 4.4.1claimsclaims-aud-shape

The aud claim MUST be a string containing the RAS issuer identifier, or an array containing exactly that one element; anything else is rejected (this prevents audience injection attacks).

run this rule in the validator →

breaks it (aud-two-elements): aud is a two-element array; exactly one RAS issuer element is allowed.

MUSTSection 4.4.1semanticssemantics-aud-value

The aud claim MUST contain the issuer identifier of the Resource Authorization Server; a mismatch is rejected with invalid_grant.

run this rule in the validator →

breaks it (aud-token-endpoint): aud carries the token endpoint, the pre-bis RFC 7523 legacy value, instead of the RAS issuer.

MUSTSection 4.4.1semanticssemantics-iss-trust

The RAS MUST reject the ID-JAG with invalid_grant if iss does not identify an IdP Authorization Server it trusts.

MUSTSection 4.4.1semanticssemantics-client-continuity

If the client authenticates, the RAS MUST reject the request with invalid_grant unless the client_id claim identifies the authenticated client.

run this rule in the validator →

breaks it (client-id-mismatch): client_id does not identify the authenticated client.

RFC 7519 Sections 4.1.4 and 4.1.6

Sections 3.1, 6.3

MUSTSections 3.1, 6.3semanticssemantics-sub-uniqueness

Subject identifiers MUST be unique when scoped with issuer (and tenant for multi-tenant issuers); requires RAS-side state.

Section 6.1

MUSTSection 6.1semanticssemantics-tenant-required

A multi-tenant issuer MUST include the tenant claim, and the RAS MUST trust iss and tenant together; needs deployment input.

Section 5.1

MAYSection 5.1semanticssemantics-client-id-cimd

The client_id relationship may be mapped out of band; when clients use Client-ID Metadata Documents the URL client_id acts as a shared global namespace and removes the mapping.

Section 3.2.1

MUSTSection 3.2.1subidsubid-format

A sub_id in the SAML NameID Subject Identifier Format MUST contain format (saml-nameid), issuer, and nameid, and MAY contain nameid_format, name_qualifier, sp_name_qualifier, and sp_provided_id; a malformed or unsupported format is rejected with invalid_grant.

run this rule in the validator →

breaks it (subid-malformed): sub_id is missing the REQUIRED nameid member.

Section 3.2.2

MUST NOTSection 3.2.2subidsubid-transient-nameid

Transient SAML NameID Formats (such as urn:oasis:names:tc:SAML:2.0:nameid-format:transient) MUST NOT be used: their values change across sessions and cannot serve as a cross-trust-domain identifier.

MUST NOTSection 3.2.2subidsubid-nameid-only

The RAS MUST NOT resolve the subject using only the nameid value unless local policy defines nameid alone as the subject identifier for that SAML issuer; a nameid without scoping members is the resolution trap.

run this rule in the validator →

breaks it (subid-nameid-only): sub_id resolves on nameid alone without scoping members; the resolution trap.

MUSTSection 3.2.2subidsubid-pairwise-mapping

Pairwise nameid values MUST be scoped to the Service Provider of the target RAS, with the mapping maintained; needs IdP-side state.

MUSTSection 3.2.2subidsubid-construction

sub_id members MUST derive from the SSO <NameID> for that RAS, with optional fields present exactly when the attributes are; needs IdP-side state.

MUSTSection 3.2.2subidsubid-required-policy

A RAS requiring the SAML NameID sub_id MUST reject with invalid_grant when it is missing, malformed, or unauthorized; policy input decides.

Section 7.1

SHOULDSection 7.1metadatametadata-idp-token-type

An IdP Authorization Server SHOULD include urn:ietf:params:oauth:token-type:id-jag in identity_chaining_requested_token_types_supported.

Sections 7.2 and 8

MUSTSections 7.2 and 8metadatametadata-grant-profiles-shape

authorization_grant_profiles_supported MUST be a JSON array of strings, each naming a supported grant profile.

Section 7.2

SHOULDSection 7.2metadatametadata-ras-profile

A Resource Authorization Server SHOULD include urn:ietf:params:oauth:grant-profile:id-jag in authorization_grant_profiles_supported (advertisement means the processing rules are implemented).

MUSTSection 7.2metadatametadata-ras-coupling

A RAS advertising urn:ietf:params:oauth:grant-profile:id-jag MUST also include urn:ietf:params:oauth:grant-type:jwt-bearer in grant_types_supported.

Section 8

SHOULDSection 8metadatametadata-client-profile

A client SHOULD include urn:ietf:params:oauth:grant-profile:id-jag in its authorization_grant_profiles_supported.

MUSTSection 8metadatametadata-client-grant-types

A client advertising the id-jag profile MUST include both urn:ietf:params:oauth:grant-type:token-exchange and urn:ietf:params:oauth:grant-type:jwt-bearer in its grant_types.

Section 4.3

REQUIREDSection 4.3mintmint-requested-token-type

requested_token_type is REQUIRED and must be urn:ietf:params:oauth:token-type:id-jag.

REQUIREDSection 4.3mintmint-audience

audience is REQUIRED and must carry exactly one Resource Authorization Server identifier.

MUSTSection 4.3mintmint-subject-token

Implementations MUST accept Identity Assertions as subject_token and MAY accept refresh tokens.

REQUIREDSection 4.3mintmint-subject-token-type

subject_token_type is REQUIRED and must be consistent with the subject_token.

OPTIONALSection 4.3mintmint-actor-token

actor_token is OPTIONAL; its processing is out of scope for this specification.

Section 4.3.3

MUSTSection 4.3.3mintmint-assertion-audience

The IdP MUST validate the subject assertion and check its audience against the authenticated client_id.

MUSTSection 4.3.3mintmint-refresh-validation

Refresh-token subject tokens get standard refresh-grant validation at the IdP.

SHOULDSection 4.3.3mintmint-refresh-assembly

A refresh-token exchange SHOULD re-assemble current subject claims for the issued ID-JAG.

MUSTSection 4.3.3mintmint-granted-values

Granted resource, scope, and authorization_details values MUST be reflected in the issued ID-JAG.

MAYSection 4.3.3mintmint-policy-narrowing

The IdP MAY narrow requested resources, scopes, or authorization details by policy.

RFC 7521 Section 5.2

MUSTRFC 7521 Section 5.2rejectionrejection-not-expired

An expired assertion MUST be rejected with invalid_grant (RFC 7521 Section 5.2).

run this rule in the validator →

breaks it (expired): The token expired before the evaluation time.

Section 4.4.3

Section 4.4.4

SHOULD NOTSection 4.4.4rejectionrejection-no-refresh-token

The RAS SHOULD NOT return a refresh token on an ID-JAG exchange; the ID-JAG itself is re-submittable.

MAYSection 4.4.4rejectionrejection-jti-single-use

The RAS MAY enforce single use by tracking jti and MAY cap exp by policy; replay tracking needs RAS-side state.

References

Normative - the rules above cite these: