You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 05:22:03