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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 04:45:54