ID PartnersAgentic Identityfor PingFederate
OpenID Federation 1.0 on PingFederate

Federation for agent identity

OpenID Federation lets organisations establish trust through signed statements. These extensions add federation to PingFederate, so it can validate and register agents under agreed policies. Registration expires when its trust chain expires. Renewal requires a valid chain.

25 of 25federation test modules completed with warnings and no failures (2026-09-25)
349specification requirements linked to tagged tests; 655 tests in total
95%of federation code mutations detected by tests
docs/federation/conformance.md

Federation roles

A trust anchor is the entity whose configured public keys establish trust in a federation. Other entities form trust chains to that anchor through signed statements. PingFederate supports the following roles.

OpenID Provider

Agents and relying parties can register on their first request or submit a signed statement to /federation/register. A relying party is an application that uses an OpenID Provider to authenticate users.

Trust anchor or intermediate

PingFederate signs statements about subordinate entities. It serves fetch and list endpoints and can constrain subordinate metadata.

Hosted agents

PingFederate signs and publishes Entity Configurations for hosted agents. Operators can suspend or revoke an agent and rotate its signing key.

Trust Mark issuer

A Trust Mark is a signed statement that an entity meets an issuer’s requirements. PingFederate can issue Trust Marks, report their status and require them for registration.

Trust chain resolver

PingFederate builds and validates an entity’s trust chain to a specified anchor. It returns a signed result.

Attestation issuer validation

PingFederate uses federation validation to establish trust in Client Attestation issuers and wallet providers.

docs/federation/overview.md

Trust chain validation

A trust chain links an entity’s signed Entity Configuration to a trust anchor through Subordinate Statements. PingFederate validates every statement in the chain.

  1. Each statement has an asymmetric signature and identifies one signing key.
  2. Each statement has a valid issue time and has not expired.
  3. Each Entity Configuration is signed with a key it publishes.
  4. Each Subordinate Statement is signed with a key established by its superior.
  5. The trust anchor signature validates against configured keys.
  6. Chain depth and domain names satisfy federation constraints.
  7. Metadata policies are compatible and applied to the registered metadata.
  8. Every critical claim and policy operator is understood.

A trust chain expires when its earliest statement expires. Chain discovery permits at most 24 fetches. By default, outbound requests require HTTPS and public IP addresses.

docs/federation/how-it-works.md TrustChainValidator.java:279-316 EntityStatementChecks.java:15-57

Trust anchor key configuration

Operators obtain trust anchor public keys out of band and configure them in OIDF_FEDERATION_TRUST_ANCHOR_JWKS. Several anchors can be trusted. Validation uses these configured keys.

PingFederate can act as its own trust anchor. In that configuration, validation reads the signing key from its key store on each check, so local key rotation needs no separate pin update.

OIDF_FEDERATION_TRUST_ANCHOR_JWKS={
  "https://federation.example.org": {"keys": [ ... ]},
  "https://partners.example.net":   {"keys": [ ... ]}
}
OIDF_FEDERATION_SELF_ANCHOR=https://pf.example.com
docs/federation/operations.md TrustAnchorSet.java:67-87

Metadata policy and constraints

An agent declares its requested scopes and authentication method. A metadata policy sets rules for those declarations. Federation constraints limit subordinate entities, including chain depth and permitted domains. PingFederate registers the resulting metadata.

For example, a policy can limit scopes to read write audit and require audit. A request for read write admin audit registers as read write audit. A request without audit is rejected.

Conflicting policies invalidate the chain. By default, PingFederate also rejects registration when no superior sets a metadata policy for the entity type.

"metadata_policy": {
  "oauth_client": {
    "scope": {
      "subset_of":   ["read", "write", "audit"],
      "superset_of": ["audit"]
    }
  }
}
MetadataPolicy.java:207-295 Constraints.java:61-114

Trust Marks

PingFederate accepts a Trust Mark when the trust anchor authorises its issuer, the issuer’s chain reaches that anchor and the signature is valid. Optional status checks confirm that the mark remains active. Invalid marks are ignored. Registration can require specified marks, and operators can grant marks for PingFederate to issue.

TrustMarkValidator.java:125-170 TrustMarkIssuer.java:81-191

Automatic registration

Agent token requests

An agent submits a signed client assertion with its token request. PingFederate validates the supplied or discovered trust chain and registers the agent. The request then proceeds to client authentication.

TokenEndpointAutoRegistrationFilter.java:164-211

Relying-party authorisation requests

A relying party submits a signed request to the authorisation or Pushed Authorization Request (PAR) endpoint. PAR lets a client submit its authorisation request directly to the server. PingFederate checks the claims before fetching the trust chain, then validates the chain and request signature before registration.

FrontChannelAutoRegistrationFilter.java:143-191

Validation after registration

Each later relying-party request must use a registered signing key and a fresh request identifier. Rejected requests receive an error page without a redirect.

docs/federation/how-it-works.md

Explicit registration

A relying party can register in advance by posting its Entity Statement or trust chain to /federation/register. PingFederate validates it and returns a signed response containing the registered metadata, keys and expiry.

RegistrationService.java:252-335

Registration expiry and revocation

By default, registration expires after one day or when the trust chain expires, whichever comes first. An agent’s next request can renew its registration if validation succeeds. A background process disables expired clients without deleting them.

Operator actionImmediate effectRemaining access
Suspend or revoke an agent PingFederate hostsNew retrieval of its Entity ConfigurationCached statements, existing registrations and issued tokens remain subject to their expiry
The entity no longer has a valid trust chainNew trust chain validationExisting registration until renewal is due; renewal then fails
Disable the client in PingFederateNew token issuanceRenewal does not re-enable a client disabled by an operator
RegistrationExpirySweeper.java:54-75 AuthoritySupport.java:178-190

Policy decisions

PingFederate can consult PingAuthorize or another AuthZEN 1.0 policy decision point before registration, agent enrolment or token issuance. A policy decision point evaluates an access request against configured policy.

A permit can restrict scopes or registration lifetime and require Trust Marks. It cannot expand the federation’s permissions. By default, an unavailable or invalid policy response returns an error and stops the operation.

{
  "subject":  {"type": "federation_entity",
               "id": "https://agents.example.com/a1"},
  "action":   {"name": "federation.register.automatic"},
  "resource": {"type": "openid_provider",
               "id": "https://pf.example.com"},
  "context":  {"scope": "read write", ...}
}
AuthZenFederationPolicyDecisionPoint.java:146-193 RegistrationPolicy.java:64-94

Endpoint client authentication

Federation endpoints allow unauthenticated access by default. Selected endpoints can require private_key_jwt client authentication. PingFederate validates the caller’s trust chain before accepting its signing key.

EndpointClientAuthentication.java:68-127

Audit records

Logs record registration decisions, renewals and expiry. They also record policy decisions and operator changes. Security events go to PingFederate’s audit log. Token-like values are replaced with fingerprints.

event=federation.registration.refused outcome=failure reason=policy_denied subject=https://agents.example.com/a1 ...
docs/federation/operations.md

Test evidence

OpenID Foundation test suite

The deployed-entity plan completed 5 modules and the OpenID Provider plan completed 20. All returned warnings about vendor metadata, with no failures. The OpenID Provider plan also rejected 13 invalid registration requests.

Repository tests

Tagged tests identify the requirements they cover. A dashboard lists requirements without tagged tests. Selected decision methods must reach 100% line and branch coverage for the build to pass.

Mutation testing

Mutation testing introduces code changes and checks whether tests detect them. Tests detected 95% of mutations in the federation library and 93% in the PingFederate integration.

docs/federation/conformance.md docs/coverage-dashboard.md (generated: tools/coverage-report.py after mvn verify, or CI's coverage-dashboard artefact)

Limits

Validation uses other entities’ current published keys. Federation endpoints support private_key_jwt client authentication only. Policy settings apply across the deployment. Locally hosted conformance results do not constitute OpenID Foundation certification.

docs/federation/limits.md