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
相关产品推荐
相关产品推荐

