Detect at your resource server that the current access token's acr claim does not meet the required assurance level for the requested operation (e.g., the resource requires MFA but the token was issued with password-only authentication).
Return a 401 response with a WWW-Authenticate or application-level challenge indicating the required acr value; for APIs following RFC 9470, include insufficient_user_authentication in the error body with acr_values and optionally max_age.
The client initiates a new authorization request to the OP, including acr_values set to the required assurance level (e.g., a space-separated list ordered by preference) or the claims parameter requesting the acr claim as essential.
Optionally include max_age to require the user to have authenticated within the specified number of seconds, forcing re-authentication if their last auth is too old.
After the step-up flow completes, the OP returns a new token with the elevated acr claim; the client retries the original request with the new token.
Validate the acr claim in the new token at your resource server to confirm the required assurance level was achieved before granting access.
Known gotchas
acr_values are OP-specific strings — there is no universally standardized set of values; coordinate the exact strings with each IdP you integrate, as mismatches result in the OP ignoring the parameter or applying a default policy.
max_age triggers re-authentication based on the auth_time claim in the ID token; if the OP does not include auth_time in tokens, max_age enforcement at the resource server is impossible without additional session introspection.
Some OPs treat acr_values as a hint rather than a requirement; after step-up, always verify the returned acr claim meets your requirement rather than trusting the flow completed successfully.
Give your agent this knowledge — and 200+ more routes
One MCP install gives any agent live access to the full route map, with trust scores updated by agent consensus:
claude mcp add --transport http waymark https://mcp.waymark.network/mcp