Azure B2C自定义策略RefreshToken流程email声明异常问题
问题分析与排查步骤
1. 修正RefreshTokenReadAndSetup的声明持久化配置
你之前的配置可能漏了将email声明标记为持久化。刷新流程依赖B2C存储的用户声明,而非动态占位符。修改RefreshTokenReadAndSetup技术配置文件:
<TechnicalProfile Id="RefreshTokenReadAndSetup"> <OutputClaims> <OutputClaim ClaimTypeReferenceId="email" DefaultValue="{OIDC:LoginHint}" AlwaysUseDefaultValue="true" Persisted="true" /> <!-- 其他声明配置 --> </OutputClaims> </TechnicalProfile>
确保Persisted="true",这样B2C会将正确的邮箱值持久化到用户存储,刷新时直接读取,而非使用占位符。
2. 隔离刷新流程与HRD触发逻辑
错误AADB2C90077说明刷新时意外触发了HRD但无有效会话。检查用户旅程的RefreshToken路径:
- 确保刷新流程仅包含读取令牌和用户信息的步骤,比如
RefreshTokenReadAndSetup、AAD-UserReadUsingObjectId,不要引入SelfAsserted或HRD步骤。 - 示例用户旅程配置:
<UserJourney Id="SignUpOrSignIn"> <OrchestrationSteps> <!-- 登录流程步骤 --> <OrchestrationStep Order="10" Type="ClaimsExchange"> <Preconditions> <Precondition Type="ClaimEquals" ExecuteActionsIf="true"> <Value>isRefreshToken</Value> <Value>true</Value> <Action>SkipThisOrchestrationStep</Action> </Precondition> </Preconditions> <!-- SelfAsserted/HRD步骤 --> </OrchestrationStep> <!-- 刷新流程专属步骤 --> <OrchestrationStep Order="20" Type="ClaimsExchange"> <Preconditions> <Precondition Type="ClaimEquals" ExecuteActionsIf="false"> <Value>isRefreshToken</Value> <Value>true</Value> <Action>SkipThisOrchestrationStep</Action> </Precondition> </Preconditions> <ClaimsExchanges> <ClaimsExchange Id="RefreshTokenSetup" TechnicalProfileReferenceId="RefreshTokenReadAndSetup" /> <ClaimsExchange Id="AADUserRead" TechnicalProfileReferenceId="AAD-UserReadUsingObjectId" /> </ClaimsExchanges> </OrchestrationStep> </OrchestrationSteps> </UserJourney>
3. 校验MSAL.js的刷新参数传递
在React应用中,检查acquireTokenSilent调用时的loginHint是否为用户真实邮箱:
- 从MSAL的
account对象中获取username字段作为loginHint,而非硬编码或错误传递占位符。 - 示例代码:
const account = msalInstance.getActiveAccount(); const request = { scopes: ["your-scopes"], loginHint: account?.username, // 确保这里是真实邮箱 }; const response = await msalInstance.acquireTokenSilent(request);
如果MSAL缓存中account.username是{OIDC:LoginHint},说明首次登录时声明未正确写入缓存,需要排查登录流程的声明返回配置。
4. 确认影子用户的email声明持久化
对于AADCommon创建的影子用户,在AAD-UserWriteUsingAlternativeSecurityId技术配置文件中,确保email被写入并持久化:
<TechnicalProfile Id="AAD-UserWriteUsingAlternativeSecurityId"> <PersistedClaims> <PersistedClaim ClaimTypeReferenceId="email" /> <!-- 其他持久化声明 --> </PersistedClaims> </TechnicalProfile>
只有写入用户存储的声明,才能在刷新时被正确读取。
5. 启用B2C日志定位问题
开启Azure B2C的Application Insights日志,查看刷新流程中:
RefreshTokenReadAndSetup步骤的email声明取值来源;- 是否有步骤错误地将
{OIDC:LoginHint}赋值给email; - 是否意外进入了需要HRD的登录流程分支。
日志中搜索{OIDC:LoginHint},可以快速定位问题发生的具体步骤。
内容的提问来源于stack exchange,提问作者Miniols
相关产品推荐
相关产品推荐

