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

Azure AD B2C刷新令牌后缺失原始认证源信息的技术咨询

Azure AD B2C 刷新令牌返回 entraTenantId 和 identityProvider 的解决方案

核心问题分析

刷新令牌(RedeemRefreshToken)流程不会重新执行完整登录流程,而是直接从Azure AD B2C用户存储读取数据并发行新令牌。因此必须确保identityProvider和entraTenantId已持久化到用户目录属性中,才能在刷新流程中被读取并返回。

具体解决步骤

1. 声明持久化配置

首先确保两个声明被存储到用户的目录属性中:

  • 在TrustFrameworkExtensions.xml的ClaimsSchema中确认声明定义(若entraTenantId是自定义声明,需先在B2C门户注册扩展属性extension_entraTenantId):
    <ClaimsSchema>
      <ClaimType Id="entraTenantId">
        <DisplayName>Entra Tenant ID</DisplayName>
        <DataType>string</DataType>
      </ClaimType>
    </ClaimsSchema>
    
  • 在用户登录的技术配置文件(如Entra ID的AAD-Common)中添加持久化声明:
    <TechnicalProfile Id="AAD-Common">
      <!-- 原有配置 -->
      <PersistedClaims>
        <PersistedClaim ClaimTypeReferenceId="identityProvider" />
        <PersistedClaim ClaimTypeReferenceId="entraTenantId" PartnerClaimType="extension_entraTenantId" />
      </PersistedClaims>
    </TechnicalProfile>
    

2. 配置RefreshTokenReadAndSetup读取声明

修改RefreshTokenReadAndSetup技术配置文件,明确读取这两个持久化的声明:

<ClaimsProvider>
  <DisplayName>Refresh Token Setup</DisplayName>
  <TechnicalProfiles>
    <TechnicalProfile Id="RefreshTokenReadAndSetup">
      <OutputClaims>
        <!-- 原有输出声明 -->
        <OutputClaim ClaimTypeReferenceId="objectId" />
        <OutputClaim ClaimTypeReferenceId="tenantId" />
        <!-- 添加需要的声明 -->
        <OutputClaim ClaimTypeReferenceId="identityProvider" />
        <OutputClaim ClaimTypeReferenceId="entraTenantId" PartnerClaimType="extension_entraTenantId" />
      </OutputClaims>
    </TechnicalProfile>
  </TechnicalProfiles>
</ClaimsProvider>

3. 确保RedeemRefreshToken旅程传递声明

检查RedeemRefreshToken用户旅程,确认RefreshTokenReadAndSetup步骤后的JWT发行环节能获取到这些声明:

<UserJourney Id="RedeemRefreshToken">
  <OrchestrationSteps>
    <OrchestrationStep Order="1" Type="ClaimsExchange">
      <ClaimsExchanges>
        <ClaimsExchange Id="RefreshTokenReadAndSetup" TechnicalProfileReferenceId="RefreshTokenReadAndSetup" />
      </ClaimsExchanges>
    </OrchestrationStep>
    <OrchestrationStep Order="2" Type="ClaimsExchange">
      <ClaimsExchanges>
        <ClaimsExchange Id="RedeemRefreshTokenExchange" TechnicalProfileReferenceId="RedeemRefreshToken" />
      </ClaimsExchanges>
    </OrchestrationStep>
    <OrchestrationStep Order="3" Type="SendClaims" CpimIssuerTechnicalProfileReferenceId="JwtIssuer" />
  </OrchestrationSteps>
</UserJourney>

4. 在RelyingParty中输出声明

在你的RP策略文件中,将两个声明加入输出令牌的列表:

<RelyingParty>
  <DefaultUserJourney ReferenceId="RedeemRefreshToken" />
  <TechnicalProfile Id="PolicyProfile">
    <DisplayName>PolicyProfile</DisplayName>
    <Protocol Name="OpenIdConnect" />
    <OutputClaims>
      <!-- 原有输出声明 -->
      <OutputClaim ClaimTypeReferenceId="objectId" PartnerClaimType="sub" />
      <!-- 添加需要的声明 -->
      <OutputClaim ClaimTypeReferenceId="identityProvider" />
      <OutputClaim ClaimTypeReferenceId="entraTenantId" />
    </OutputClaims>
    <SubjectNamingInfo ClaimType="sub" />
  </TechnicalProfile>
</RelyingParty>

5. 验证现有用户数据

对于已存在的用户,需确保他们的目录属性中已存在identityProvider和extension_entraTenantId的值。新用户登录时,Entra ID的技术配置文件会自动写入这些值。

替代方案说明

若不想持久化自定义声明,可尝试利用identityProvider默认存储的特性(B2C会自动存储该值),但entraTenantId作为自定义声明必须持久化才能在刷新流程中获取。

内容的提问来源于stack exchange,提问作者1584SO

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 18:22:28