Repository navigation
Replies: 2 comments
|
Update / correction to myself. Since opening this, I found that the practical goal behind the proposal — selecting the login method The mechanism is "Dynamic Authentication Flow selection using Client Policies", combining two
So you make one flow per method ( I verified this end-to-end (password / passkey / X.509, single- and multi-valued For my use case this fully covers it — flow selection gives "exact" behaviour for free (the target flow The only thing native flow selection doesn't touch is the One separate gap I did hit while building the PoC (flagging it here for completeness, though it's really |
Uh oh!
There was an error while loading. Please reload this page.
While building an OIDC step-up setup — where the first-factor method is chosen from the requested ACR
(password / passkey / X.509 client cert) — I hit two OIDC limitations that SAML step-up doesn't have.
Floating it here in Ideas before proposing a formal enhancement.
The gap
SAML step-up already honours
RequestedAuthnContext Comparisonwith exact / minimum / maximumsemantics (
SamlProtocolUtils.checkLoAExact/checkLoAMinimum/checkLoAMaximum, behindSTEP_UP_AUTHENTICATION_SAML). The OIDC side has no equivalent:Condition - Level of Authenticationis cumulative only (requestedLoa >= configuredLoa). There'sno "exact" mode, so you can't express "
acr=X⇒ exactly method A" — a higher level always also runsthe lower method.
acr_valuesis always collapsed to its minimum.acr_valuesis a space-separatedpreference list (RFC 9470 §3), but
AuthorizationEndpointreduces it with.min(), soacr_values="silver gold"silently becomessilver. There's no way to pick the highest acceptablelevel or honour preference order.
Net effect: the same client intent behaves differently depending on whether the client speaks OIDC or
SAML.
The idea
Two small, backwards-compatible additions behind the existing
STEP_UP_AUTHENTICATIONfeature:minimum(today's default) vsexact;acr_values—minimum(default) vsmaximum(and maybelater
exact-any/ preference-order).Together,
exact+maximummeans "authenticate at exactly the highest requested level", which is whatmakes disjoint ACR→method selection possible over OIDC.
Concrete example
Realm map
low→1, high→2:acr_values="low high"→ collapses to1→ password.maximum:acr_values="low high"→2→ passkey.exacton the level-2 subflow: it runs only for level-2 requests, not as a step on top oflevel 1.
Open questions
Comparisonmodel directly (share the enum/semantics), or an OIDC-specific config?per-execution on the condition (like
loa-condition-level)?maximumenough to start, or shouldexact-any/ preference-order come in from the beginning?acrclaim mapping?I have a working reference implementation (as external
ConditionalAuthenticatorSPIs) plus a PR-scopeddesign, and I'm happy to do the PR if there's appetite. Curious what the maintainers and community think.
All reactions