Managing external identities to enable secure access for partners, customers, and other non-employees
Wrong answer. Removed
This browser is no longer supported.
Upgrade to Microsoft Edge to take advantage of the latest features, security updates, and technical support.
Related to the already-acknowledged bug in this thread (resend not invalidating the previous OTP within the same flow). We found a more severe variant: an OTP code issued by a completely different flow (self-service password reset) is accepted to satisfy a sign-in MFA challenge, on a continuation_token that has no relation to the reset flow whatsoever.
ca459b94-c28a-466c-8643-ef1934f0ba10 (rockatest.ciamlogin.com)afbec61a-53b4-49d1-8a3a-7b4c49781b62mfa_required/AADSTS50074 on password grant).POST /resetpassword/v1.0/start with the user's username → continuation_token.POST /resetpassword/v1.0/challenge with that continuation_token → Entra emails an 8-digit OTP (call it CODE-A). The reset flow is abandoned here — continue/submit are never called, the user's password is never changed.POST /oauth2/v2.0/initiate → POST /oauth2/v2.0/challenge (challenge_type=password oob redirect, capabilities=mfa_required registration_required) → POST /oauth2/v2.0/token (grant_type=password, correct password) → returns error=invalid_grant, suberror=mfa_required (AADSTS50074), a new, unrelated continuation_token.POST /oauth2/v2.0/introspect with that continuation_token → returns the registered method id.POST /oauth2/v2.0/challenge (challenge_type=oob, id=<method id>) → Entra emails a second, independent 8-digit OTP (call it CODE-B) and returns a fresh continuation_token for this sign-in MFA round. CODE-B is never used.POST /oauth2/v2.0/token with grant_type=mfa_oob, this sign-in continuation_token, and CODE-A (the password-reset code from step 2), plus scope.Step 6 returns HTTP 200 with a full, valid access_token/refresh_token/id_token for the user — i.e. the password-reset OTP is accepted as the MFA second factor for an entirely unrelated sign-in continuation_token.
2026-09-01 15:26:28Zx-ms-request-id: c59d3eab-fffd-4dcc-91f6-50d0ac350200x-ms-ests-server: 2.1.25181.4 - FRC ProdSlicesmfa_required error (step 3) at 2026-09-01 15:22:47Z had correlation_id: 4bb99295-5bc2-4571-81fd-637802260d48, trace_id: b0a247c2-0b97-4518-98d3-edff0cc20200.Step 6 should fail (invalid/expired code) — the OTP from an unrelated flow/continuation_token should not satisfy a different flow's MFA challenge.
This isn't just "resend doesn't invalidate the old code within one flow" (already tracked in the linked thread) — it suggests Entra's OTP validation for a given identity+method isn't scoped to the continuation_token/flow at all, but to a single shared "current valid code(s) for this user's email OTP method," regardless of which native-auth flow requested it (SSPR vs sign-in MFA vs presumably registration). That undermines the assumption that a continuation_token meaningfully scopes which code is acceptable.
Is this the same root cause as the resend issue, or a distinct bug? Any guidance on tracking/escalation for this specific cross-flow case would be appreciated. Related to the already-acknowledged bug in this thread (resend not invalidating the previous OTP within the same flow). We found a more severe variant: an OTP code issued by a completely different flow (self-service password reset) is accepted to satisfy a sign-in MFA challenge, on a continuation_token that has no relation to the reset flow whatsoever.
ca459b94-c28a-466c-8643-ef1934f0ba10 (rockatest.ciamlogin.com)afbec61a-53b4-49d1-8a3a-7b4c49781b62mfa_required/AADSTS50074 on password grant).POST /resetpassword/v1.0/start with the user's username → continuation_token.POST /resetpassword/v1.0/challenge with that continuation_token → Entra emails an 8-digit OTP (call it CODE-A). The reset flow is abandoned here — continue/submit are never called, the user's password is never changed.POST /oauth2/v2.0/initiate → POST /oauth2/v2.0/challenge (challenge_type=password oob redirect, capabilities=mfa_required registration_required) → POST /oauth2/v2.0/token (grant_type=password, correct password) → returns error=invalid_grant, suberror=mfa_required (AADSTS50074), a new, unrelated continuation_token.POST /oauth2/v2.0/introspect with that continuation_token → returns the registered method id.POST /oauth2/v2.0/challenge (challenge_type=oob, id=<method id>) → Entra emails a second, independent 8-digit OTP (call it CODE-B) and returns a fresh continuation_token for this sign-in MFA round. CODE-B is never used.POST /oauth2/v2.0/token with grant_type=mfa_oob, this sign-in continuation_token, and CODE-A (the password-reset code from step 2), plus scope.Step 6 returns HTTP 200 with a full, valid access_token/refresh_token/id_token for the user — i.e. the password-reset OTP is accepted as the MFA second factor for an entirely unrelated sign-in continuation_token.
2026-09-01 15:26:28Zx-ms-request-id: c59d3eab-fffd-4dcc-91f6-50d0ac350200x-ms-ests-server: 2.1.25181.4 - FRC ProdSlicesmfa_required error (step 3) at 2026-09-01 15:22:47Z had correlation_id: 4bb99295-5bc2-4571-81fd-637802260d48, trace_id: b0a247c2-0b97-4518-98d3-edff0cc20200.Step 6 should fail (invalid/expired code) — the OTP from an unrelated flow/continuation_token should not satisfy a different flow's MFA challenge.
This isn't just "resend doesn't invalidate the old code within one flow" (already tracked in the linked thread) — it suggests Entra's OTP validation for a given identity+method isn't scoped to the continuation_token/flow at all, but to a single shared "current valid code(s) for this user's email OTP method," regardless of which native-auth flow requested it (SSPR vs sign-in MFA vs presumably registration). That undermines the assumption that a continuation_token meaningfully scopes which code is acceptable.
Is this the same root cause as the resend issue, or a distinct bug? Any guidance on tracking/escalation for this specific cross-flow case would be appreciated.
Managing external identities to enable secure access for partners, customers, and other non-employees
Wrong answer. Removed