When an identity provider disables an account, revokes a session or detects a compromised credential, the applications that trusted its earlier sign-in usually keep honouring sessions and tokens until they expire. The OpenID Shared Signals Framework (SSF) closes that gap by giving identity providers, SaaS applications, device management tools and security platforms a standard way to send each other security events in near real time. Its two main profiles are CAEP, the Continuous Access Evaluation Profile, for session and access changes, and RISC, Risk Incident Sharing and Coordination, for account-level incidents. All three are now Final specifications at the OpenID Foundation. This guide explains how the framework works, what each event means, how to deploy a transmitter or receiver safely and how to measure whether it is working. It is for identity engineers, SaaS platform teams and detection engineers; token and session fundamentals are covered in the Token and Session Security Guide.
Key takeaways
- SSF is the transport and management layer. It defines Security Event Tokens, subject identifiers, transmitter discovery at
/.well-known/ssf-configuration, push and poll delivery, and a stream management API. - CAEP carries access changes. Eight event types cover session revoked, token claims change, credential change, assurance level change, device compliance change, session established, session presented and risk level change.
- RISC carries account incidents. Events such as account disabled (with reason hijacking or bulk-account), credential compromise, identifier recycled and recovery information changed help relying parties protect linked accounts.
- Receiving a signal is only half the job. Value comes from a documented action per event type, such as ending sessions, revoking refresh tokens or forcing step-up, tested end to end with verification events.
- The streams themselves are sensitive. A forged or suppressed event can lock users out or keep an attacker in, so authenticate stream management, validate every SET signature and audience, and monitor stream health.
Why continuous signals are needed
Federation is a one-time decision. At sign-in, the identity provider vouches for the user and the application issues its own session and often its own tokens. Later changes at the provider, such as an account disabled by the help desk, a password reset after phishing, a device falling out of compliance or a risk engine flagging a hijack, do not reach the application. The usual workarounds are short session lifetimes, which annoy users, or periodic polling, which is slow and expensive.
SSF replaces both with events. The party that observes a change, the Transmitter, sends a signed event to every Receiver that has subscribed to that subject, and each receiver decides what to do. Signals flow in both directions: an application can transmit to the identity provider just as easily, for example to report that a session was presented from an unexpected network. Microsoft documents its Entra Continuous Access Evaluation as based on CAEP, with resource providers and Entra exchanging events so that tokens stop being honoured after critical changes. The same pattern is central to the continuous verification principle in the Zero Trust Identity Guide.
Specification status
| Specification | Status (checked 24 October 2026) | Role |
|---|---|---|
| OpenID Shared Signals Framework 1.0 | Final, published 29 August 2025 | Events, subjects, discovery, delivery and stream management |
| OpenID Continuous Access Evaluation Profile (CAEP) 1.0 | Final | Session, credential, device and risk change events |
| OpenID RISC Profile 1.0 | Final | Account incident events between providers and relying parties |
| CAEP Interoperability Profile 1.0 | Implementer's Draft 1 (still a draft) | Narrows options so independent transmitters and receivers interoperate |
| Earlier Implementer's Drafts (SSF ID3, CAEP ID2, RISC ID2) | Superseded by the Final versions | Still found in older products; check which version a vendor implements |
The framework builds on IETF standards: Security Event Tokens (RFC 8417), push delivery (RFC 8935), poll delivery (RFC 8936) and subject identifiers (RFC 9493). The OpenID Foundation also lists a formal security analysis of SSF transmitter configuration discovery, dated April 2024.
How the framework works
Security Event Tokens
- Format: each event is a signed JWT with explicit type
typ: secevent+jwt. Theeventsclaim holds the event type URI and its fields. - Claims:
issmust match the stream configuration and the discovery issuer;audidentifies the receiver;jtiis unique per token;txnshould be set and unique to the underlying event, so related events can be correlated. - What is absent: SETs must not include
suborexp. They describe something that already happened, so receivers do not reject them as expired; Google's RISC documentation tells receivers to skip the expiry check for that reason. - Forward compatibility: receivers must ignore fields they do not understand.
Subjects
- Primary subject: the top-level
sub_idclaim. Older CAEP and RISC events may also use asubjectfield inside the event, but transmitters must still includesub_id, and new event types use onlysub_id. - Formats: RFC 9493 identifiers such as
email,phone_number,iss_subandopaque, plus SSF additionsjwt_id,saml_assertion_idandip-addresses. - Complex subjects: combine members such as
user,device,session,application,tenant,org_unitandgroup, so an event can target "this user's session on this device". Receivers must discard events containing critical members they cannot process.
Discovery, delivery and streams
- Transmitter metadata: published at
/.well-known/ssf-configuration(inserted before any issuer path, per RFC 8615), listing the issuer,jwks_uri, supported delivery methods, management endpoints, authorisation schemes, critical subject members anddefault_subjects(ALLorNONE). RISC transmitters may still use the older/risc-configurationpath. - Push delivery (RFC 8935): the transmitter POSTs SETs to an HTTPS endpoint the receiver supplies. Lowest latency; the receiver must be reachable.
- Poll delivery (RFC 8936): the receiver fetches SETs from an endpoint the transmitter supplies and acknowledges them. Suits receivers behind firewalls or with bursty processing.
- Stream management API: create (POST), read (GET), update (PATCH), replace (PUT) and delete (DELETE) a stream; set status to enabled, paused or disabled; add and remove subjects; and request a verification event. Transmitters must send a Stream Updated event when they change a stream's status themselves. The API is optional for transmitters but recommended.
- Authorisation of management calls: must use standard HTTP authentication unless another trust mechanism exists, and must tie each receiver to its own stream IDs and audience values.
Push or poll
| Factor | Push (RFC 8935) | Poll (RFC 8936) |
|---|---|---|
| Latency | Seconds | Depends on poll interval |
| Network exposure | Receiver exposes an inbound HTTPS endpoint | Receiver makes outbound calls only |
| Back pressure | Transmitter must retry if the receiver is down; events can be lost after long outages | Events wait at the transmitter until acknowledged, within its retention limits |
| Typical fit | SaaS applications receiving from an identity provider | On-premises systems, SIEM pipelines, receivers with strict ingress rules |
CAEP events and how to act on them
All CAEP event types use the base URI https://schemas.openid.net/secevent/caep/event-type/ and share optional fields: event_timestamp, initiating_entity (admin, user, policy or system), reason_admin and reason_user, the last two keyed by language tag.
| Event (URI suffix) | Key fields | Typical receiver action |
|---|---|---|
session-revoked | None beyond common fields | End the matching local sessions and revoke refresh tokens issued on the strength of them |
token-claims-change | claims (required): new values | Re-evaluate authorisation, for example a role or group removed, without waiting for the next sign-in |
credential-change | credential_type (for example password, fido2-platform, x509, phone-sms), change_type (create, revoke, update, delete) | Treat a revoked or deleted credential as grounds to end sessions; alert on unexpected additions |
assurance-level-change | namespace, current_level, optional previous_level and change_direction | Require step-up for sensitive functions when assurance decreases |
device-compliance-change | previous_status, current_status (compliant or not-compliant) | Block or restrict sessions from the device until compliant |
session-established | Optional fp_ua, acr, amr, ext_id | Correlate with the provider's view; detect sessions the provider did not create |
session-presented | Optional fp_ua, ext_id | Detect a session used from a different user agent than the one that established it |
risk-level-change | principal (for example USER, DEVICE, SESSION), current_level (LOW, MEDIUM, HIGH), recommended risk_reason | Apply the policy for that risk level: step-up, restrict or revoke |
Session established and session presented together are a building block for detecting stolen session cookies (MITRE ATT&CK T1539, Steal Web Session Cookie): if a provider and an application share fingerprints, a session presented from an unfamiliar user agent stands out. See the Session Hijacking and Cookie Theft Guide.
RISC events and the RISC profile
RISC targets a different problem: an attacker who takes over a user's email or identity provider account can use it to recover or sign in to every linked account. RISC lets the provider tell relying parties promptly. Event URIs use the base https://schemas.openid.net/secevent/risc/event-type/.
| Event | Meaning | Relying party response |
|---|---|---|
account-disabled (reason hijacking) | Provider disabled the account because it was taken over | End sessions, suspend sign-in and account recovery through that provider |
account-disabled (reason bulk-account) | Account was part of bulk creation, often abuse | Review activity on the linked account |
account-enabled | Account restored | Re-enable provider sign-in after your own checks |
account-purged | Account permanently deleted | Unlink the federated identity |
account-credential-change-required | User was required to change a credential | Heightened monitoring of the linked account |
credential-compromise | A credential was found compromised; credential_type required | Force reset if the same credential type is used locally; revoke sessions |
identifier-changed and identifier-recycled | Email or phone changed, or now belongs to a different person | Stop using the old identifier for recovery; a recycled identifier must never unlock the old account |
recovery-activated and recovery-information-changed | Recovery started or recovery details changed | Watch for follow-on takeover of linked accounts |
opt-in, opt-out-initiated, opt-out-cancelled, opt-out-effective | The user's participation in RISC; events continue for a period after opt-out is requested to deter hijackers | Track the state per subject |
The RISC sessions-revoked event is deprecated; new implementations use CAEP session-revoked. Google's Cross-Account Protection is a widely documented RISC deployment, and its documentation shows the practical details: receivers register through a service account holding the RISC Configuration Admin role and the risc.googleapis.com stream API, validate tokens against keys from https://accounts.google.com/.well-known/risc-configuration, return HTTP 202 for valid tokens, and de-duplicate on jti because events may be redelivered. Google sends events only for users who granted the app the profile or email scope, does not currently send them for Workspace users, and still uses the deprecated subject_type field, so receivers need tolerant parsing. For the fraud side of account takeover, see the Account Takeover Prevention Guide.
Choosing a role and an architecture
- Receiver only: the common starting point for SaaS applications and internal apps that federate to an identity provider. Highest value: session revoked and credential change from the provider.
- Transmitter only: identity providers, device management and endpoint tools, and risk engines that hold signals other systems need.
- Both: large platforms and identity providers that want feedback from resource applications, for example IP or device context, which is the two-way model Microsoft describes for CAE.
- Hub: larger organisations often route signals through one broker or ITDR platform that receives from several transmitters, applies policy and fans out actions, so each application integrates once. See the ITDR Guide.
Small organisations: usually consume SSF through features their identity provider and major SaaS vendors already ship. Ask vendors which SSF, CAEP and RISC versions and event types they support, whether they transmit, receive or both, and what action each received event triggers. Large organisations: need an event catalogue, an owner per stream, a policy per event type and application, and monitoring of stream health as production infrastructure.
How to implement
- Define the actions first. For each event type you will accept, write the action, its scope (session, user, device) and who is notified. Without this, events land in a log and nothing changes.
- Start with one pair and one event. Identity provider to your most sensitive SaaS application, receiving
session-revoked. The CAEP Interoperability Profile requires implementations to support at least one of session revocation, credential change or device compliance change, so most vendors cover one of these. - Configure the stream securely. Discover the transmitter from its well-known metadata, create the stream requesting only the event types you have mapped, register subjects explicitly unless
default_subjectsisALLby design, and protect management calls with OAuth. The interoperability profile uses scopesssf.readandssf.manage, tokens valid for no more than 60 minutes, sent in the header only. - Validate every SET. Check the
kidagainst the transmitter'sjwks_uri, the signature,issandaud, and reject duplicates byjti. The interoperability profile signs with RS256 using keys of at least 2048 bits and requires TLS 1.2 or later. - Test end to end. Use the verification event to prove delivery, then trigger real events in a test tenant: disable a test user, reset a password, mark a device non-compliant. Measure time from the change to the session actually ending.
- Run in observe mode, then enforce. Log the action the receiver would take for two weeks, compare with expectations, then enable enforcement per event type. Roll back by setting the action to log-only, not by disabling the stream, so you keep visibility.
- Extend. Add credential change, device compliance and risk level events, then RISC for consumer-facing sign-in, then transmission from your own applications back to the provider.
Where non-human identities fit
SSF subjects are not limited to people: the framework lists devices, tenants, organisational units, groups and applications, and complex subjects can carry an application member. In practice most shipped events concern users and sessions, so do not assume a vendor transmits events about service accounts or OAuth client credentials. The gap matters: in the Salesloft Drift breach, stolen OAuth tokens for one integration were used across many Salesforce tenants from 8 to 18 August 2025 until all Drift tokens were revoked on 20 August, with Google revoking the Drift Email tokens on 28 August. Revocation was coordinated by the vendors through advisories rather than through a standard signal each customer system could act on automatically. Ask providers whether they emit credential-change or token-claims-change for integrations and agents, and pair SSF with the controls in the OAuth Token Theft Incident Playbook.
Detection and measurement
- Stream health: stream status changes (including Stream Updated events from the transmitter), delivery failures and retries, poll backlog, and time since the last verification event succeeded. A paused or disabled stream silently removes protection; Google notes that it does not buffer events while a stream is paused.
- Security of the channel: SET signature or audience failures, events from unknown issuers, subject removal requests (the SSF specification flags malicious subject removal and subject probing as threats), and changes to stream configuration.
- Effect: for each received event, whether the mapped action ran and how long it took. In Microsoft's CAE, critical events are applied in near real time with propagation latency of up to 15 minutes, which is a realistic benchmark.
| Metric | What good looks like |
|---|---|
| Median time from provider change to session ended at the application | Minutes, measured with test accounts every month |
Percentage of high-risk applications receiving at least session-revoked | Rising to 100% |
| Percentage of received events with a completed mapped action | Near 100%; investigate every unactioned event type |
| SET validation failures per week | Near zero; spikes investigated as possible forgery or key rotation issues |
| Streams with a successful verification event in the last 24 hours | 100% |
| Hours of stream downtime per month | Falling; alerting within minutes of failure |
Common failure patterns
- Ending the session but not the tokens. A receiver that clears its web session on
session-revokedbut leaves refresh tokens and API tokens valid leaves the attacker's access intact. - Subscribing without acting. Events reach a SIEM, nobody owns the action, and the application keeps serving the session.
- Subject mismatch. The transmitter sends
iss_subwhile the receiver indexes users by email, so events match nobody. Agree formats up front; the interoperability profile requires receivers to acceptemailandiss_sub. - Weak stream management authorisation. A shared, long-lived token for the management API lets anyone holding it remove subjects or disable the stream, quietly turning off protection.
- Rejecting SETs as expired or treating them as access tokens. SETs carry no
expand are not credentials; applying access token validation logic breaks delivery. - Version drift. Products built on Implementer's Drafts use older field names, such as
subjectinstead ofsub_idor RISCsubject_type; parse tolerantly and test against each peer.
Framework mapping
| Framework | Reference | Relevance |
|---|---|---|
| NIST SP 800-53 Rev. 5 | AC-2, AC-12, IA-11, SC-23 | Account management changes, session termination, re-authentication, session authenticity |
| NIST SP 800-53 Rev. 5 | SI-4, AU-6, IR-4 | Monitoring, review of audit records, incident handling driven by shared events |
| NIST CSF 2.0 | PR.AA-05, DE.CM-03, DE.AE-02, RS.MI-01 | Enforced authorisations, activity monitoring, event analysis, containment |
| MITRE ATT&CK v20 | T1539, T1528, T1550.001, T1078.004 | Session cookie theft, token theft and reuse, cloud account abuse that signals help contain |
| MITRE D3FEND | D3-ST Session Termination, D3-WSAA Web Session Activity Analysis | The countermeasures receivers implement on CAEP events |
| ISO/IEC 27001:2022 Annex A | 5.18 Access rights, 8.5 Secure authentication, 8.16 Monitoring activities | Control homes for revocation, authentication state and event monitoring |
Practitioner checklist
- Inventory which of your identity providers, SaaS applications and device tools transmit or receive SSF events, and which spec versions they implement.
- Write an action per accepted event type, with owner and scope, before enabling any stream.
- Start with
session-revokedfrom the identity provider to your most sensitive applications. - Make receivers revoke refresh and API tokens as well as web sessions.
- Validate SET signature,
iss,audandjtion every event, and never checkexp. - Protect stream management with short-lived OAuth tokens scoped to
ssf.readandssf.manage. - Agree subject identifier formats with each peer and test matching with real accounts.
- Alert on stream pause, disable, delivery failure and missing verification events.
- Measure time from provider change to session end every month with test accounts.
- Ask vendors whether they emit events for integrations, OAuth clients and agents, not only users.
Standards and references
- OpenID Foundation: Shared Signals Framework Specification 1.0
- OpenID Foundation: Continuous Access Evaluation Profile 1.0
- OpenID Foundation: RISC Profile Specification 1.0
- OpenID Foundation: CAEP Interoperability Profile 1.0
- OpenID Foundation: Shared Signals Working Group Specifications
- Google for Developers: Protect user accounts with Cross-Account Protection
- Microsoft Learn: Continuous access evaluation
Related NHI Mgmt Group resources: Token and Session Security Guide · Zero Trust Identity Guide · Fraud and Cyber Convergence Guide · Conditional Access Guide · OAuth 2.1, GNAP and FAPI Guide