Azure B2C自定义策略重置密码后登录报AADB2C90088错误如何解决
Azure B2C 自定义策略密码重置后登录报错解决方案
错误详情
HTTP/1.1 400 Bad Request Cache-Control: private Allow: OPTIONS,TRACE,GET,HEAD,POST Content-Type: application/json; charset=utf-8 x-ms-gateway-requestid: a6264e6b-e73e-45e1-aab9-71c5916e1215 Access-Control-Expose-Headers: Content-Length, Content-Encoding Access-Control-Allow-Credentials: true Access-Control-Allow-Methods: POST, OPTIONS Set-Cookie: x-ms-cpim-trans=; domain=****; expires=Fri, 02-Sep-2011 12:14:12 GMT; path=/; SameSite=None; secure; HttpOnly X-Frame-Options: DENY Public: OPTIONS,TRACE,GET,HEAD,POST Strict-Transport-Security: max-age=31536000; includeSubDomains X-Content-Type-Options: nosniff X-XSS-Protection: 1; mode=block Date: Thu, 02 Sep 2021 12:14:12 GMT Content-Length: 296 {"error":"invalid_grant","error_description":"AADB2C90088: The provided grant has not been issued for this endpoint. Actual Value : B2C_1A_MFA_phone_or_email and Expected Value : B2C_1A_PasswordReset\r\nCorrelation ID: ******\r\nTimestamp: 2021-09-02 12:14:12Z\r\n"}
错误核心原因
AADB2C90088错误本质是授权授予所属策略与令牌请求端点的策略不匹配:当前请求携带的授权码是B2C_1A_MFA_phone_or_email策略颁发的,但被发送到了B2C_1A_PasswordReset策略的令牌端点,因此触发校验失败。
出现两次令牌请求的原因是密码重置流程完成后,自动登录逻辑错误复用了MFA步骤遗留的授权上下文,导致额外发起了一次策略不匹配的令牌请求。
具体解决步骤
- 步骤1:修正密码重置用户旅程的会话配置
打开B2C_1A_PasswordReset自定义策略的用户旅程定义,在最后一个编排步骤中,绑定密码重置策略自身的会话管理技术配置文件,禁止继承MFA子旅程的会话上下文:<OrchestrationStep Order="N" Type="SendClaims" CpimIssuerTechnicalProfileReferenceId="JwtIssuer"> <UseTechnicalProfileForSessionManagement ReferenceId="SM-AAD" /> </OrchestrationStep> - 步骤2:配置密码重置流程直接颁发令牌
在B2C_1A_PasswordReset策略的RelyingParty节点中,完善令牌输出配置,确保密码重置全流程走完后直接返回身份令牌,不需要额外跳转登录端点发起授权请求:<RelyingParty> <DefaultUserJourney ReferenceId="PasswordReset" /> <TechnicalProfile Id="PolicyProfile"> <DisplayName>PolicyProfile</DisplayName> <Protocol Name="OpenIdConnect" /> <OutputClaims> <OutputClaim ClaimTypeReferenceId="objectId" PartnerClaimType="sub"/> <OutputClaim ClaimTypeReferenceId="tenantId" AlwaysUseDefaultValue="true" DefaultValue="{Policy:TenantObjectId}" /> <!-- 补充其他你需要返回的业务声明 --> </OutputClaims> <SubjectNamingInfo ClaimType="sub" /> </TechnicalProfile> </RelyingParty> - 步骤3:修正前端授权上下文逻辑
如果你使用MSAL类库发起授权请求,需要在密码重置流程触发时重置MSAL的实例上下文,避免复用之前MFA登录时存储的policy参数,确保密码重置流程的所有请求携带的policy参数始终为B2C_1A_PasswordReset。 - 步骤4:清理跨策略遗留会话
在密码重置用户旅程的倒数第二个编排步骤中,添加清理旧策略会话的技术配置文件,清除B2C_1A_MFA_phone_or_email策略遗留的会话Cookie:<TechnicalProfile Id="ClearMFASession"> <DisplayName>Clear MFA Policy Session</DisplayName> <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.SelfAssertedAttributeProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> <Metadata> <Item Key="SessionManagementTechnicalProfileReferenceId">SM-MFA</Item> <Item Key="ClearSession">true</Item> </Metadata> </TechnicalProfile>
验证方式
完成配置后重新走一遍密码重置全流程,观察网络请求中仅存在一次令牌请求且返回200状态码,用户无需重新输入凭证即可直接进入系统。
内容的提问来源于stack exchange,提问作者Pankaj Agrawal
相关产品推荐
相关产品推荐

