Azure AD B2C自定义策略密码过期时ClaimType异常求助
Azure AD B2C自定义策略:密码过期场景下声明转换缺失Claim的解决方案
问题核心
在密码过期强制重置流程中,调用AAD-UserWritePasswordUsingObjectIdWithoutStrongAuth-ResetNextLogin时,因CreateDisplayNameFromFirstNameAndLastName声明转换依赖的givenName和surname未被加载导致报错;同时SelfAsserted-ForcePasswordReset-ExpiredPassword未获取到objectId。
解决方案
1. 修复objectId及用户属性加载问题
SelfAsserted-ForcePasswordReset-ExpiredPassword需要上游流程提前加载用户核心属性。在密码过期流程的步骤中,在调用该技术配置文件之前,先执行读取用户信息的技术配置文件(如AAD-UserReadUsingObjectId),确保objectId、givenName、surname被加载到声明包中:
<UserJourneyBehaviors> <!-- 示例流程步骤片段 --> <OrchestrationStep Order="5" Type="ClaimsExchange"> <ClaimsExchanges> <ClaimsExchange Id="AAD-UserRead" TechnicalProfileReferenceId="AAD-UserReadUsingObjectId" /> </ClaimsExchanges> </OrchestrationStep> <OrchestrationStep Order="6" Type="ClaimsExchange"> <ClaimsExchanges> <ClaimsExchange Id="SelfAsserted-ForcePasswordReset" TechnicalProfileReferenceId="SelfAsserted-ForcePasswordReset-ExpiredPassword" /> </ClaimsExchanges> </OrchestrationStep> </UserJourneyBehaviors>
2. 让声明转换支持字段缺失时跳过
修改CreateDisplayNameFromFirstNameAndLastName的执行逻辑,添加前置条件,仅当givenName和surname都存在时才执行转换,避免字段缺失时报错:
<TechnicalProfile Id="AAD-WriteCommon"> <Preconditions> <Precondition Type="ClaimsExist" ExecuteActionsIf="true"> <Value>givenName</Value> <Value>surname</Value> <Action>ExecuteClaimsTransformation</Action> <Action>CreateDisplayNameFromFirstNameAndLastName</Action> </Precondition> </Preconditions> <!-- 原有配置内容 --> </TechnicalProfile>
如果需要在字段缺失时设置默认值(比如用邮箱替代),可以修改声明转换的格式参数:
<ClaimsTransformation Id="CreateDisplayNameFromFirstNameAndLastName" TransformationMethod="FormatStringMultipleClaims"> <InputClaims> <InputClaim ClaimTypeReferenceId="givenName" TransformationClaimType="inputClaim1" /> <InputClaim ClaimTypeReferenceId="surname" TransformationClaimType="inputClaim2" /> <InputClaim ClaimTypeReferenceId="email" TransformationClaimType="inputClaim3" /> </InputClaims> <InputParameters> <InputParameter Id="stringFormat" Value="{0} {1}" /> <InputParameter Id="emptyStringReplacement" Value="{2}" /> </InputParameters> <OutputClaims> <OutputClaim ClaimTypeReferenceId="displayName" TransformationClaimType="outputClaim" /> </OutputClaims> </ClaimsTransformation>
3. 确保写入技术配置文件获取所需Claim
在AAD-UserWritePasswordUsingObjectIdWithoutStrongAuth-ResetNextLogin中明确声明输入Claim,确保已加载的用户属性能被传递:
<TechnicalProfile Id="AAD-UserWritePasswordUsingObjectIdWithoutStrongAuth-ResetNextLogin"> <InputClaims> <InputClaim ClaimTypeReferenceId="objectId" Required="true" /> <InputClaim ClaimTypeReferenceId="givenName" /> <InputClaim ClaimTypeReferenceId="surname" /> <InputClaim ClaimTypeReferenceId="password" Required="true" /> </InputClaims> <!-- 原有继承及配置内容 --> </TechnicalProfile>
关键注意点
- 全程不修改
SelfAsserted-ForcePasswordReset-ExpiredPassword的用户交互部分,避免影响原有用户体验。 - 前置条件判断是避免报错的核心,确保声明转换仅在必要字段存在时执行。
内容的提问来源于stack exchange,提问作者Kiran Ramaswamy
相关产品推荐
相关产品推荐

