Criteria verified as of August 2026. Re-verify on the web before committing to anything (§8).
1. Scope and triggers
Applies when designing, implementing or reviewing: OAuth 2.1/OIDC flows (authorization_code+PKCE,
client_credentials, device code, token exchange), token design and validation (JWT/opaque,
aud, scope, TTL, refresh rotation, revocation), SAML federation, deployment and
configuration of IdPs (Keycloak, Authentik, Authelia, Zitadel, FreeIPA, Entra ID, Okta,
Ory), passkeys/WebAuthn and MFA policy, SSO and SCIM provisioning, authorisation
models (RBAC/ABAC/ReBAC) and policy engines (OpenFGA, SpiceDB, Cedar, OPA), PAM and
just-in-time elevation, break-glass accounts, workload identity (SPIFFE/SPIRE,
OIDC federation towards cloud), session management and single logout, and the
joiner-mover-leaver cycle with access recertification.
Not applicable: see aws-standards/azure-standards/gcp-standards (the specific
provider's IAM: policies, roles, conditions, SCPs), microservices-architecture-standards
(mTLS/service mesh and context propagation between services), appsec-standards (authorisation
failures inside the application code: IDOR, broken access control),
secrets-management-standards (custody and rotation of static secrets),
cryptography-pki-standards (signature algorithms, JWKS at the cryptographic level, certificate
issuance), cicd-standards (configuration of the pipeline that consumes OIDC),
windows-server-ad-standards (the directory and the Windows platform: forest, GPO, Kerberos and
NTLM, Tier 0/PAW, gMSA/dMSA, krbtgt, AD CS — here, the modern federation and identity that sit
on top of it or replace it), incident-response-forensics-standards (mass revocation of
sessions and tokens during an identity compromise), identity-threat-detection-standards
(the attack against identity, its detection and its response —session theft, token abuse,
malicious OAuth consent, revocation as containment—; here, identity architecture,
SSO, MFA and the account lifecycle), privacy-engineering-standards (the personal
data the directory holds and its lifecycle).
2. Default decisions
Verify the latest version on the web before pinning it in a real project (§8). This
domain moved a lot in 2025-2026: do not pin versions or spec statuses from memory.
Decision
Default
Justifiable alternative
Protocol
OIDC over OAuth 2.1 (current profile: PKCE mandatory, no implicit, no ROPC)
SAML 2.0 only against SaaS that does not offer OIDC
Access token format
JWT profiled (RFC 9068) validated locally by the resource
Opaque token + introspection (RFC 7662) if immediate revocation is required
Confidential client authentication
private_key_jwt or mTLS (RFC 8705)
client_secret_basic only in legacy, rotated and in a secrets manager
Token binding
DPoP (RFC 9449) or mTLS-bound for high-value tokens
Plain bearer only on internal traffic with a short TTL
Authentication factor
Passkey/WebAuthn phishing-resistant
TOTP as a transition; SMS/voice/email OTP only for recovery, never on privileged accounts
Self-hosted IdP
Keycloak (maturity, SAML+OIDC, federation)
Authentik/Zitadel (DX, multi-tenant), Authelia (lightweight portal/forward-auth), FreeIPA only as directory+Kerberos
Authorisation engine
RBAC in the IdP + ReBAC (OpenFGA/SpiceDB) for per-object permissions
Cedar for verifiable embedded policies; OPA/Rego for the platform (admission/IaC), not for high-cardinality per-object authz
Provisioning
SCIM 2.0 (RFC 7643/7644) from the IdP as the source
Directory/HR-driven sync (midPoint, Syncope) in organisations with formal IGA
Workload identity
SPIFFE/SPIRE (X.509-SVID for mTLS, JWT-SVID for APIs)
The provider's native OIDC federation (workload identity) — never static keys
Privileged access
JIT with approval and recording (Teleport, Boundary, the provider's PIM)
Bastion + short-lived SSH certificates
3. Structure and conventions
Flow by client type (there are no other options)
Client
Flow
Non-negotiable requirements
Web with backend
authorization_code + PKCE
Authenticated confidential client; tokens only in the backend
SPA / browser
authorization_code + PKCE with a BFF
Session in an HttpOnly cookie; tokens out of the JS
Mobile / native
authorization_code + PKCE (RFC 8252)
Custom Tab / ASWebAuthenticationSession; redirect via claimed app link; never an embedded WebView
Service→service
client_credentials with private_key_jwt/mTLS
Better still: SPIFFE or OIDC federation with no secret
TV/CLI/IoT
Device authorization grant (RFC 8628)
Short user_code, short TTL, confirmation screen naming the resource
Delegation/downscope
Token exchange (RFC 8693)
Reduced scope and aud, never widened
Dead: implicit (response_type=token) and ROPC (password grant) — removed in
OAuth 2.1 and discouraged by the security BCP (RFC 9700). If they show up in a design,
they are a finding, not an option.
Token design
aud mandatory and verified by every resource; a token valid for "everything" is a
master key. iss, exp, nbf/iat validated; alg against an explicit allowlist
(RFC 8725): forbidden to accept the token's alg without a list, and forbidden none.
TTL: access 5-15 min; refresh rotating with reuse detection (reusing a
refresh revokes the whole family). On public clients rotation is not optional.
Revocation (RFC 7009) + propagation via CAEP/SSF. Assume revoking a JWT takes no
effect until exp: the TTL is your revocation latency, size it accordingly.
Fine-grained scope named by resource+action (invoices:read), never admin:all
nor wildcards. Per-object permissions do not live in the token: they are queried from the PDP.
Authorisation claims in the token only if they are stable and low-cardinality; dynamic
roles in the token = stale permissions for the whole TTL.
Session and logout
BFF session cookie: __Host- prefix, HttpOnly, Secure, SameSite=Lax
(Strict if the flow allows it), without Domain. Rotation of the session identifier on
authentication and on privilege elevation.
Logout: RP-Initiated Logout (user trigger) + Back-Channel Logout (effective
server to server). The four OIDC logout specs have been Final Specifications since
September 2022; Session Management 1.0 (iframe + polling) is useless under
third-party cookie restrictions: do not use it as the only mechanism.
Inactivity and absolute timeouts defined by risk level; re-authentication
(prompt=login, max_age) before sensitive operations (payments, MFA change, credential
enrolment).
Passkeys and MFA policy
Passkey/WebAuthn by default. WebAuthn Level 3 was proposed to W3C Recommendation on
20 Jul 2026 (CR of 26 May 2026); check its status before citing the version.
NIST SP 800-63B-4: AAL2 must offer a phishing-resistant option; AAL3 requires a
phishing-resistant authenticator with a non-exportable key → a synced passkey
reaches AAL2 at most, and administrators need a device-bound key (FIDO2
hardware) or certificate-based authentication.
Attestation: do not require it in public applications (it pushes the user to worse methods,
such as SMS OTP); in corporate fleets requiring device-bound is reasonable.
Portability solved: FIDO CXF (format, Proposed Standard) and CXP (encrypted
transport) already deployed on iOS and on Android 14+ with Play Services 26.21+. Provider
lock-in is no longer an argument for not adopting passkeys.
Authorisation
RBAC for the organisational axis (roles per domain, not per person), ABAC for
conditions (tenant, data sensitivity, time, network, device posture),
ReBAC (Zanzibar model: OpenFGA, SpiceDB) when the real question is "what relationship
does this subject have with this object?" (hierarchies, sharing, inheritance).
Centralised PDP (decision) + PEP in every service (enforcement). Deny by default. The
frontend hides options; it does not authorise.
The authorisation model is versioned code with tests (§4) and its decision is auditable:
subject, action, object, result, policy and policy version.
Multi-tenant: the tenant is derived from the token/context, never from a request
parameter.
Workload identity and federation
Between services: SPIFFE/SPIRE SVIDs (X.509 for mTLS, JWT-SVID for APIs). Zero
long-lived static secrets between services.
OIDC federation towards cloud (CI, K8s): exact per-claim conditions. In GitHub
Actions use repository_id, job_workflow_ref and environment; a sub with a wildcard
requires StringLike (with StringEquals a * is compared literally and never matches, which
tends to get "fixed" by widening permissions).
GitHub issues an immutable subject claim (numeric IDs with @) on repos created,
renamed or transferred from 15 Jul 2026: if AssumeRoleWithWebIdentity fails
after a rename, the condition is fixed — the wildcard is never widened.
// Trust policy: the minimum acceptable (neither a wildcard sub, nor an absent sub)
"Condition": {
"StringEquals": {
"token.actions.githubusercontent.com:aud": "sts.amazonaws.com",
"token.actions.githubusercontent.com:repository_id": "123456789",
"token.actions.githubusercontent.com:environment": "production"
},
"StringLike": {
"token.actions.githubusercontent.com:job_workflow_ref": "org/infra-workflows/.github/workflows/deploy.yml@refs/heads/main"
}
}
Joiner-mover-leaver cycle
Single source of truth (HR → IdP). Onboarding, change and offboarding propagated by SCIM the same
day; deprovisioning does not wait for the quarterly cycle.
Recertification: privileged access quarterly, the rest half-yearly or yearly, with
evidence and effective revocation of whatever is not confirmed (ISO 27001:2022 A.5.15/A.5.16/A.5.17/
A.5.18; NIST SP 800-53 AC-2/AC-5/AC-6).
Service accounts: named owner, expiry, rotation and review; no shared human
accounts.
Third-party SaaS/OAuth integrations: inventory of connected apps, minimum scopes,
periodic review and immediate revocation during an incident. In the UNC6395 campaign against
Salesloft Drift OAuth tokens (8-18 Aug 2025, 700+ organisations) there was no malware nor
MFA bypass: valid tokens and legitimate APIs were enough.
PAM, JIT and break-glass
Zero standing access to production: JIT elevation with approval, short window,
recorded reason and session recording. Ephemeral credentials (SSH/DB certificates lasting
minutes), not stored passwords.
Break-glass: ≥2 accounts, credentials under split/physical custody, an MFA method
different from the usual one (FIDO2 or cert-based), excluded from conditional access
policies but not exempt from the platform's mandatory MFA (Entra enforces it at the
client application level, independently of CA exclusions), an alert on every
use and documented periodic testing. An untested break-glass does not exist.
4. Quality and testing (CI gates)
Negative token tests (mandatory, they break the build): expired, foreign aud,
invalid signature, tampered alg and none, different iss, unknown kid, replay of the
code, missing PKCE or incorrect code_verifier, redirect_uri not an exact match,
reused refresh (must revoke the family).
Policy as code with tests: OpenFGA/Cedar/OPA ship a test runner. Permit and
deny cases, including cross-tenant. Policy without a test = policy not
reviewed.
Federated trust scanning: a linter/policy that fails on a sub with a broad
wildcard, an absent sub/aud condition, or StringEquals with * in trust policies.
Secret scanning of tokens and client secrets in repos and logs (the scanner is set by
secrets-management-standards, as is the rotation procedure after the leak).
Conformance when implementing or parameterising an OP/RP: pass the OpenID
Certification suites before exposing it, not after the incident.
Deprovisioning test: an integration test verifying that offboarding in the source
of truth cuts access in the target systems.
5. Security
Flow surface: redirect_uri with an exact match (no wildcards or
suffixes), state and nonce verified, iss parameter in the response (RFC 9207) to
avoid mix-up between several IdPs, PAR (RFC 9126) and/or JAR (RFC 9101) in high-risk
profiles.
Consent phishing / device code phishing: a consent screen naming the
application and the data, controlled client registration (no open dynamic client
registration), and an alert on new high-privilege consents.
Token theft: a stolen bearer = access. Bind (DPoP/mTLS) what is valuable, short TTL,
anomalous-use detection (geo/UA/volume) and propagated revocation.
SAML (legacy only): validate the signature over the Responseand the Assertion, Audience,
Recipient, Destination, InResponseTo, NotOnOrAfter; reject unsigned assertions;
watch for XML Signature Wrapping and canonicalisation; metadata and signing certificates
rotated with overlap.
User enumeration: uniform responses and timings in login, registration and recovery.
Account recovery: it is the weak link of the entire MFA policy — treat it at the
same level (do not fall back to SMS/email OTP to recover an account with a passkey).
Passwords (where they exist): hashing and policy in cryptography-pki-standards and
appsec-standards; here only the rule — no composition rules, no periodic
expiry without a reason, with a check against breached lists.
6. Operability
Authentication events as first-class telemetry: login ok/failed, MFA,
method change, consents, token issuance/refresh/revocation, break-glass use
and role changes. Logs kept intact and retained for forensics; alert on
patterns (distributed brute force, MFA fatigue, break-glass use, credential enrolment on a
privileged account).
JWKS: cache per kid respecting the TTL, tolerance to rotation (publish the new key
before signing with it, retire the old one afterwards), and do not hit the endpoint on every request.
JWKS failure = fail-closed.
The IdP is a SPOF: multi-AZ HA, capacity sized for the login peak, rehearsed DR
and a degradation plan (what keeps working with the IdP down, and for how long).
SSF/CAEP (SSF 1.0, CAEP 1.0 and RISC 1.0 approved as Final Specifications on
2 Sep 2025; CAEP interoperability profile in final review until 25 Sep 2026) to
propagate revocation and risk changes in real time between providers.
Rate limiting and anti-automation protection on /token, /authorize, login and
recovery.
7. Sustainability and prohibitions
Cadence: review the IdP's version and CVEs at least quarterly; self-hosted IdPs and IGA
systems receive critical advisories frequently (e.g. Apache Syncope published in
July 2026 patches for six vulnerabilities, including the privilege escalation
CVE-2026-62183, with no binary hotfixes: they force an upgrade or a recompile).
Follow the specs' status, not memory: OAuth 2.1 was still an Internet-Draft
(draft-ietf-oauth-v2-1-15, 2 Mar 2026) in August 2026, although its content is already
enforceable via RFC 9700 and the RFCs it consolidates.
Debt with a fixed deadline: every exception (legacy client with a static secret, SAML, TOTP on
admins) carries a date and a ticket.
FORBIDDEN
❌ implicit and ROPC (password grant) in any new design.
❌ Tokens in localStorage/sessionStorage or in the URL; tokens in logs.
❌ redirect_uri with a wildcard or prefix/suffix matching.
❌ Accepting the token's alg without an allowlist; alg: none; not verifying aud or iss.
❌ Non-rotating refresh tokens on public clients; access tokens lasting hours or days.
❌ Long-lived static secrets between services or in CI (OIDC federation exists).
❌ Federated trust policies with a wildcard sub (repo:org/*, :*) or without a sub condition.
❌ Shared human accounts, permanent admins, and break-glass without periodic testing.
❌ SMS/voice/email OTP as a factor on privileged accounts.
❌ Authorisation decided in the frontend or duplicated ad-hoc in every service.
❌ Dynamic client registration open to the internet without control or review.
❌ Manual deprovisioning or deprovisioning deferred to the audit cycle.
❌ Syncing passwords between systems instead of federating identity.
Token with verified aud, alg on an allowlist, short TTL, rotating refresh, revocation with a plan.
Phishing-resistant MFA; passkeys; admins with a device-bound key; recovery at the same level.
Centralised authz, deny-by-default, tenant derived from the token, decisions audited and with tests.
Workload identity without secrets; federated conditions by exact claim.
SCIM with same-day deprovisioning; recertification with evidence; connected apps inventoried.
JIT with approval and recording; break-glass ≥2 with independent MFA, alerted and tested.
Auth events in the SIEM; JWKS cached and fail-closed; IdP with HA and rehearsed DR.
8. Mandatory web verification
Before pinning a version, spec status or behaviour in a deliverable:
OAuth 2.1: status in the IETF datatracker (is it still an Internet-Draft or already an RFC?) and
the current revision; also the BCP for browser-based applications
(draft-ietf-oauth-browser-based-apps) and FAPI 2.0 if it applies to the profile.
Versions and EOL of your IdP (Keycloak, Authentik, Authelia, Zitadel, FreeIPA, Ory) and
its breaking changes in the latest major, plus open CVEs for the component.
WebAuthn Level 3: is it already a W3C Recommendation? Status of CXP/CXF and of real support in
browsers and platforms.
SSF/CAEP/IPSIE: status of the interoperability profile and what your provider really
supports (what is published ≠ what is implemented).
Authorisation engines: version and status of OpenFGA, SpiceDB, Cedar and OPA (syntax/major
changes that break existing policies) and of SPIRE.
Federated claim format of the provider (GitHub, GitLab, K8s) before writing
conditions: they change and break deployments.
NIST SP 800-63B-4 and the current phishing-resistant MFA guidance, if there is a compliance
requirement.
If the web contradicts this document, the web wins — flag the discrepancy.
1---2name: identity-access-management-standards3description: Identity and access management standards. Use when working with OAuth 2.1/OIDC flows, PKCE, JWT or opaque tokens, SAML, Keycloak, Authentik, Authelia, Zitadel, Okta, passkeys/WebAuthn, MFA policy, SCIM provisioning, RBAC/ABAC/ReBAC engines (OpenFGA, SpiceDB, Cedar), SPIFFE/SPIRE workload identity, PAM/JIT elevation.4---56# Identity and access management (IAM) standards78Criteria verified as of **August 2026**. Re-verify on the web before committing to anything (§8).910## 1. Scope and triggers1112Applies when designing, implementing or reviewing: OAuth 2.1/OIDC flows (`authorization_code`+PKCE,13`client_credentials`, device code, token exchange), token design and validation (JWT/opaque,14`aud`, `scope`, TTL, refresh rotation, revocation), SAML federation, deployment and15configuration of IdPs (Keycloak, Authentik, Authelia, Zitadel, FreeIPA, Entra ID, Okta,16Ory), passkeys/WebAuthn and MFA policy, SSO and SCIM provisioning, authorisation17models (RBAC/ABAC/ReBAC) and policy engines (OpenFGA, SpiceDB, Cedar, OPA), PAM and18just-in-time elevation, break-glass accounts, workload identity (SPIFFE/SPIRE,19OIDC federation towards cloud), session management and single logout, and the20joiner-mover-leaver cycle with access recertification.2122**Not applicable**: see `aws-standards`/`azure-standards`/`gcp-standards` (the specific23provider's IAM: policies, roles, conditions, SCPs), `microservices-architecture-standards`24(mTLS/service mesh and context propagation between services), `appsec-standards` (authorisation25failures inside the application code: IDOR, broken access control),26`secrets-management-standards` (custody and rotation of static secrets),27`cryptography-pki-standards` (signature algorithms, JWKS at the cryptographic level, certificate28issuance), `cicd-standards` (configuration of the pipeline that consumes OIDC),29`windows-server-ad-standards` (the **directory** and the Windows platform: forest, GPO, Kerberos and30NTLM, Tier 0/PAW, gMSA/dMSA, `krbtgt`, AD CS — here, the modern federation and identity that sit31on top of it or replace it), `incident-response-forensics-standards` (mass revocation of32sessions and tokens during an identity compromise), `identity-threat-detection-standards`33(**the attack against identity, its detection and its response** —session theft, token abuse,34malicious OAuth consent, revocation as containment—; **here, identity architecture,35SSO, MFA and the account lifecycle**), `privacy-engineering-standards` (the personal36data the directory holds and its lifecycle).3738## 2. Default decisions3940> Verify the latest version on the web before pinning it in a real project (§8). This41> domain moved a lot in 2025-2026: do not pin versions or spec statuses from memory.4243| Decision | Default | Justifiable alternative |44|---|---|---|45| Protocol | **OIDC over OAuth 2.1** (current profile: PKCE mandatory, no implicit, no ROPC) | SAML 2.0 **only** against SaaS that does not offer OIDC |46| Access token format | **JWT** profiled (RFC 9068) validated locally by the resource | **Opaque** token + introspection (RFC 7662) if immediate revocation is required |47| Confidential client authentication | `private_key_jwt` or mTLS (RFC 8705) | `client_secret_basic` only in legacy, rotated and in a secrets manager |48| Token binding | **DPoP** (RFC 9449) or mTLS-bound for high-value tokens | Plain bearer only on internal traffic with a short TTL |49| Authentication factor | **Passkey/WebAuthn** phishing-resistant | TOTP as a transition; SMS/voice/email OTP only for recovery, never on privileged accounts |50| Self-hosted IdP | **Keycloak** (maturity, SAML+OIDC, federation) | Authentik/Zitadel (DX, multi-tenant), Authelia (lightweight portal/forward-auth), FreeIPA only as directory+Kerberos |51| Authorisation engine | **RBAC** in the IdP + **ReBAC** (OpenFGA/SpiceDB) for per-object permissions | Cedar for verifiable embedded policies; OPA/Rego for the platform (admission/IaC), not for high-cardinality per-object authz |52| Provisioning | **SCIM 2.0** (RFC 7643/7644) from the IdP as the source | Directory/HR-driven sync (midPoint, Syncope) in organisations with formal IGA |53| Workload identity | **SPIFFE/SPIRE** (X.509-SVID for mTLS, JWT-SVID for APIs) | The provider's native OIDC federation (workload identity) — never static keys |54| Privileged access | **JIT with approval and recording** (Teleport, Boundary, the provider's PIM) | Bastion + short-lived SSH certificates |5556## 3. Structure and conventions5758### Flow by client type (there are no other options)5960| Client | Flow | Non-negotiable requirements |61|---|---|---|62| Web with backend | `authorization_code` + PKCE | Authenticated confidential client; tokens **only** in the backend |63| SPA / browser | `authorization_code` + PKCE with a **BFF** | Session in an `HttpOnly` cookie; tokens out of the JS |64| Mobile / native | `authorization_code` + PKCE (RFC 8252) | Custom Tab / `ASWebAuthenticationSession`; redirect via claimed app link; **never** an embedded WebView |65| Service→service | `client_credentials` with `private_key_jwt`/mTLS | Better still: SPIFFE or OIDC federation with no secret |66| TV/CLI/IoT | Device authorization grant (RFC 8628) | Short `user_code`, short TTL, confirmation screen naming the resource |67| Delegation/downscope | Token exchange (RFC 8693) | Reduced scope and `aud`, never widened |6869**Dead**: `implicit` (`response_type=token`) and ROPC (`password` grant) — removed in70OAuth 2.1 and discouraged by the security BCP (RFC 9700). If they show up in a design,71they are a finding, not an option.7273### Token design7475- `aud` mandatory and **verified by every resource**; a token valid for "everything" is a76 master key. `iss`, `exp`, `nbf`/`iat` validated; `alg` against an explicit allowlist77 (RFC 8725): forbidden to accept the token's `alg` without a list, and forbidden `none`.78- TTL: access **5-15 min**; refresh **rotating** with reuse detection (reusing a79 refresh revokes the whole family). On public clients rotation is not optional.80- Revocation (RFC 7009) + propagation via CAEP/SSF. Assume revoking a JWT takes no81 effect until `exp`: the TTL **is** your revocation latency, size it accordingly.82- Fine-grained `scope` named by resource+action (`invoices:read`), never `admin:all`83 nor wildcards. Per-object permissions do not live in the token: they are queried from the PDP.84- Authorisation claims in the token only if they are stable and low-cardinality; dynamic85 roles in the token = stale permissions for the whole TTL.8687### Session and logout8889- BFF session cookie: `__Host-` prefix, `HttpOnly`, `Secure`, `SameSite=Lax`90 (`Strict` if the flow allows it), without `Domain`. Rotation of the session identifier on91 authentication and on privilege elevation.92- Logout: **RP-Initiated Logout** (user trigger) + **Back-Channel Logout** (effective93 server to server). The four OIDC logout specs have been Final Specifications since94 September 2022; **Session Management 1.0** (iframe + polling) is useless under95 third-party cookie restrictions: do not use it as the only mechanism.96- Inactivity **and** absolute timeouts defined by risk level; re-authentication97 (`prompt=login`, `max_age`) before sensitive operations (payments, MFA change, credential98 enrolment).99100### Passkeys and MFA policy101102- Passkey/WebAuthn by default. WebAuthn **Level 3** was proposed to W3C Recommendation on103 20 Jul 2026 (CR of 26 May 2026); check its status before citing the version.104- NIST SP 800-63B-4: AAL2 must **offer** a phishing-resistant option; AAL3 requires a105 phishing-resistant authenticator with a **non-exportable** key → a synced passkey106 reaches AAL2 at most, and administrators need a device-bound key (FIDO2107 hardware) or certificate-based authentication.108- Attestation: do not require it in public applications (it pushes the user to worse methods,109 such as SMS OTP); in corporate fleets requiring device-bound is reasonable.110- Portability solved: FIDO **CXF** (format, Proposed Standard) and **CXP** (encrypted111 transport) already deployed on iOS and on Android 14+ with Play Services 26.21+. Provider112 lock-in is no longer an argument for not adopting passkeys.113114### Authorisation115116- **RBAC** for the organisational axis (roles per domain, not per person), **ABAC** for117 conditions (tenant, data sensitivity, time, network, device posture),118 **ReBAC** (Zanzibar model: OpenFGA, SpiceDB) when the real question is "what relationship119 does this subject have with this object?" (hierarchies, sharing, inheritance).120- Centralised PDP (decision) + PEP in every service (enforcement). **Deny by default**. The121 frontend hides options; **it does not authorise**.122- The authorisation model is versioned code with tests (§4) and its decision is auditable:123 subject, action, object, result, policy and policy version.124- Multi-tenant: the `tenant` is derived from the token/context, **never** from a request125 parameter.126127### Workload identity and federation128129- Between services: SPIFFE/SPIRE SVIDs (X.509 for mTLS, JWT-SVID for APIs). Zero130 long-lived static secrets between services.131- OIDC federation towards cloud (CI, K8s): **exact per-claim** conditions. In GitHub132 Actions use `repository_id`, `job_workflow_ref` and `environment`; a `sub` with a wildcard133 requires `StringLike` (with `StringEquals` a `*` is compared literally and never matches, which134 tends to get "fixed" by widening permissions).135- GitHub issues an **immutable subject claim** (numeric IDs with `@`) on repos created,136 renamed or transferred from **15 Jul 2026**: if `AssumeRoleWithWebIdentity` fails137 after a rename, the condition is fixed — the wildcard is **never** widened.138139```jsonc140// Trust policy: the minimum acceptable (neither a wildcard sub, nor an absent sub)141"Condition": {142 "StringEquals": {143 "token.actions.githubusercontent.com:aud": "sts.amazonaws.com",144 "token.actions.githubusercontent.com:repository_id": "123456789",145 "token.actions.githubusercontent.com:environment": "production"146 },147 "StringLike": {148 "token.actions.githubusercontent.com:job_workflow_ref": "org/infra-workflows/.github/workflows/deploy.yml@refs/heads/main"149 }150}151```152153### Joiner-mover-leaver cycle154155- Single source of truth (HR → IdP). Onboarding, change and **offboarding** propagated by SCIM the same156 day; deprovisioning does not wait for the quarterly cycle.157- Recertification: privileged access **quarterly**, the rest half-yearly or yearly, with158 evidence and effective revocation of whatever is not confirmed (ISO 27001:2022 A.5.15/A.5.16/A.5.17/159 **A.5.18**; NIST SP 800-53 AC-2/AC-5/AC-6).160- Service accounts: named owner, expiry, rotation and review; no shared human161 accounts.162- **Third-party SaaS/OAuth integrations**: inventory of connected apps, minimum scopes,163 periodic review and immediate revocation during an incident. In the UNC6395 campaign against164 Salesloft Drift OAuth tokens (8-18 Aug 2025, 700+ organisations) there was no malware nor165 MFA bypass: valid tokens and legitimate APIs were enough.166167### PAM, JIT and break-glass168169- **Zero standing access to production**: JIT elevation with approval, short window,170 recorded reason and session recording. Ephemeral credentials (SSH/DB certificates lasting171 minutes), not stored passwords.172- Break-glass: **≥2 accounts**, credentials under split/physical custody, an MFA method173 **different** from the usual one (FIDO2 or cert-based), excluded from conditional access174 policies but **not** exempt from the platform's mandatory MFA (Entra enforces it at the175 client application level, independently of CA exclusions), an alert on every176 use and **documented periodic testing**. An untested break-glass does not exist.177178## 4. Quality and testing (CI gates)1791801. **Negative token tests** (mandatory, they break the build): expired, foreign `aud`,181 invalid signature, tampered `alg` and `none`, different `iss`, unknown `kid`, replay of the182 `code`, missing PKCE or incorrect `code_verifier`, `redirect_uri` not an exact match,183 reused refresh (must revoke the family).1842. **Policy as code with tests**: OpenFGA/Cedar/OPA ship a test runner. Permit **and**185 deny cases, including cross-tenant. Policy without a test = policy not186 reviewed.1873. **Federated trust scanning**: a linter/policy that fails on a `sub` with a broad188 wildcard, an absent `sub`/`aud` condition, or `StringEquals` with `*` in trust policies.1894. **Secret scanning** of tokens and client secrets in repos and logs (the scanner is set by190 `secrets-management-standards`, as is the rotation procedure after the leak).1915. **Conformance** when implementing or parameterising an OP/RP: pass the OpenID192 Certification suites before exposing it, not after the incident.1936. **Deprovisioning test**: an integration test verifying that offboarding in the source194 of truth cuts access in the target systems.195196## 5. Security197198- Flow surface: `redirect_uri` with an **exact match** (no wildcards or199 suffixes), `state` and `nonce` verified, `iss` parameter in the response (RFC 9207) to200 avoid mix-up between several IdPs, PAR (RFC 9126) and/or JAR (RFC 9101) in high-risk201 profiles.202- **Consent phishing / device code phishing**: a consent screen naming the203 application and the data, **controlled** client registration (no open dynamic client204 registration), and an alert on new high-privilege consents.205- **Token theft**: a stolen bearer = access. Bind (DPoP/mTLS) what is valuable, short TTL,206 anomalous-use detection (geo/UA/volume) and propagated revocation.207- SAML (legacy only): validate the signature over the `Response` **and** the `Assertion`, `Audience`,208 `Recipient`, `Destination`, `InResponseTo`, `NotOnOrAfter`; reject unsigned assertions;209 watch for XML Signature Wrapping and canonicalisation; metadata and signing certificates210 rotated with overlap.211- User enumeration: uniform responses and timings in login, registration and recovery.212- Account recovery: it is the weak link of the entire MFA policy — treat it at the213 same level (do not fall back to SMS/email OTP to recover an account with a passkey).214- Passwords (where they exist): hashing and policy in `cryptography-pki-standards` and215 `appsec-standards`; here only the rule — no composition rules, no periodic216 expiry without a reason, with a check against breached lists.217218## 6. Operability219220- **Authentication events as first-class telemetry**: login ok/failed, MFA,221 method change, consents, token issuance/refresh/revocation, break-glass use222 and role changes. Logs kept intact and retained for forensics; alert on223 patterns (distributed brute force, MFA fatigue, break-glass use, credential enrolment on a224 privileged account).225- **JWKS**: cache per `kid` respecting the TTL, tolerance to rotation (publish the new key226 before signing with it, retire the old one afterwards), and do not hit the endpoint on every request.227 JWKS failure = **fail-closed**.228- **The IdP is a SPOF**: multi-AZ HA, capacity sized for the login peak, rehearsed DR229 and a degradation plan (what keeps working with the IdP down, and for how long).230- **SSF/CAEP** (SSF 1.0, CAEP 1.0 and RISC 1.0 approved as Final Specifications on231 2 Sep 2025; CAEP interoperability profile in final review until 25 Sep 2026) to232 propagate revocation and risk changes in real time between providers.233- Rate limiting and anti-automation protection on `/token`, `/authorize`, login and234 recovery.235236## 7. Sustainability and prohibitions237238- **Cadence**: review the IdP's version and CVEs at least quarterly; self-hosted IdPs and IGA239 systems receive critical advisories frequently (e.g. Apache Syncope published in240 July 2026 patches for six vulnerabilities, including the privilege escalation241 CVE-2026-62183, with no binary hotfixes: they force an upgrade or a recompile).242- Follow the specs' status, not memory: OAuth 2.1 **was still an Internet-Draft**243 (`draft-ietf-oauth-v2-1-15`, 2 Mar 2026) in August 2026, although its content is already244 enforceable via RFC 9700 and the RFCs it consolidates.245- Debt with a fixed deadline: every exception (legacy client with a static secret, SAML, TOTP on246 admins) carries a date and a ticket.247248**FORBIDDEN**249- ❌ `implicit` and ROPC (`password` grant) in any new design.250- ❌ Tokens in `localStorage`/`sessionStorage` or in the URL; tokens in logs.251- ❌ `redirect_uri` with a wildcard or prefix/suffix matching.252- ❌ Accepting the token's `alg` without an allowlist; `alg: none`; not verifying `aud` or `iss`.253- ❌ Non-rotating refresh tokens on public clients; access tokens lasting hours or days.254- ❌ Long-lived static secrets between services or in CI (OIDC federation exists).255- ❌ Federated trust policies with a wildcard `sub` (`repo:org/*`, `:*`) or without a `sub` condition.256- ❌ Shared human accounts, permanent admins, and break-glass without periodic testing.257- ❌ SMS/voice/email OTP as a factor on privileged accounts.258- ❌ Authorisation decided in the frontend or duplicated ad-hoc in every service.259- ❌ Dynamic client registration open to the internet without control or review.260- ❌ Manual deprovisioning or deprovisioning deferred to the audit cycle.261- ❌ Syncing passwords between systems instead of federating identity.262263### Quick review checklist264265- [ ] Correct flow per client type, PKCE present, exact `redirect_uri`, `state`/`nonce` verified.266- [ ] Token with verified `aud`, `alg` on an allowlist, short TTL, rotating refresh, revocation with a plan.267- [ ] Phishing-resistant MFA; passkeys; admins with a device-bound key; recovery at the same level.268- [ ] Centralised authz, deny-by-default, tenant derived from the token, decisions audited and with tests.269- [ ] Workload identity without secrets; federated conditions by exact claim.270- [ ] SCIM with same-day deprovisioning; recertification with evidence; connected apps inventoried.271- [ ] JIT with approval and recording; break-glass ≥2 with independent MFA, alerted and tested.272- [ ] Auth events in the SIEM; JWKS cached and fail-closed; IdP with HA and rehearsed DR.273274## 8. Mandatory web verification275276Before pinning a version, spec status or behaviour in a deliverable:2772781. **OAuth 2.1**: status in the IETF datatracker (is it still an Internet-Draft or already an RFC?) and279 the current revision; also the BCP for browser-based applications280 (`draft-ietf-oauth-browser-based-apps`) and FAPI 2.0 if it applies to the profile.2812. **Versions and EOL of your IdP** (Keycloak, Authentik, Authelia, Zitadel, FreeIPA, Ory) and282 its breaking changes in the latest major, plus open CVEs for the component.2833. **WebAuthn Level 3**: is it already a W3C Recommendation? Status of CXP/CXF and of real support in284 browsers and platforms.2854. **SSF/CAEP/IPSIE**: status of the interoperability profile and what your provider really286 supports (what is published ≠ what is implemented).2875. **Authorisation engines**: version and status of OpenFGA, SpiceDB, Cedar and OPA (syntax/major288 changes that break existing policies) and of SPIRE.2896. **Federated claim format** of the provider (GitHub, GitLab, K8s) before writing290 conditions: they change and break deployments.2917. **NIST SP 800-63B-4** and the current phishing-resistant MFA guidance, if there is a compliance292 requirement.293294If the web contradicts this document, **the web wins** — flag the discrepancy.
Run npx skillmds@latest add serialexperimentslainnnn/identity-access-management-standards in your terminal (requires Node.js), paste this page's agent-chat prompt into Claude, Cursor, or any MCP-connected agent, or download the SKILL.md file and copy it into your agent's skills directory.
Identity and access management standards. Use when working with OAuth 2.1/OIDC flows, PKCE, JWT or opaque tokens, SAML, Keycloak, Authentik, Authelia, Zitadel, Okta, passkeys/WebAuthn, MFA policy, SCIM provisioning, RBAC/ABAC/ReBAC engines (OpenFGA, SpiceDB, Cedar), SPIFFE/SPIRE workload identity, PAM/JIT elevation. It is listed under Integrations & APIs on SkillMD.
This skill has not completed SkillMD's automated safety review yet. Capability flags: reads secrets. SkillMD never runs a skill's scripts for you; review the SKILL.md before installing.
This skill is tagged as working with Claude Code, Claude.ai, OpenAI Codex. SKILL.md is an open format, so most agents that read a skills directory can load it too.
Yes. Installing skills from SkillMD is free, and the skill stays under its author's original license.
serialexperimentslainnnn (@serialexperimentslainnnn) published this skill. Their other Agent Skills are listed on their SkillMD profile.