在密码重设用户旅程中有条件地更新自定义属性的值

时间:2019-04-11 15:20:17

标签: azure-ad-b2c

我正在尝试更新密码重置用户旅程中的扩展属性(extension_StatusFlag)之一的值。我仅在且仅当extension_StatusFlag属性的值为MigratedNotActivated时才这样做。 extension_StatusFlag可能有4个不同的值。

我添加了带有前提条件的OrchestrationStep来检查extension_StatusFlag的值,如果条件满足,则仅调用技术档案来更新属性值。

已在PasswordReset用户旅程中的OrchestrationStep步骤下方添加

<OrchestrationStep Order="3" Type="ClaimsExchange">
      <Preconditions>
        <Precondition Type="ClaimEquals" ExecuteActionsIf="false">
          <Value>extension_StatusFlag</Value>
          <Value>MigratedNotActivated</Value>
          <Action>SkipThisOrchestrationStep</Action>
        </Precondition>
      </Preconditions>
      <ClaimsExchanges>
        <ClaimsExchange Id="Update_extension_StatusFlagToActive" TechnicalProfileReferenceId="LocalAccountChange_extension_StatusFlagToActiveUsingObjectId" />
      </ClaimsExchanges>
    </OrchestrationStep>

我创建了如下的技术资料:

<TechnicalProfile Id="LocalAccountChange_extension_StatusFlagToActiveUsingObjectId">
      <DisplayName>Change extension_StatusFlag to active</DisplayName>
      <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.SelfAssertedAttributeProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
      <Metadata>
        <Item Key="ContentDefinitionReferenceId">api.localaccountpasswordreset</Item>
      </Metadata>
      <CryptographicKeys>
        <Key Id="issuer_secret" StorageReferenceId="B2C_1A_TokenSigningKeyContainer" />
      </CryptographicKeys>
      <InputClaims>
        <InputClaim ClaimTypeReferenceId="objectId" />
      </InputClaims>
      <ValidationTechnicalProfiles>
        <ValidationTechnicalProfile ReferenceId="AAD-UserWriteAccountStatusUsingObjectId" />
      </ValidationTechnicalProfiles>
    </TechnicalProfile>

然后是验证技术资料:

<TechnicalProfile Id="AAD-UserWriteAccountStatusUsingObjectId">
      <Metadata>
        <Item Key="Operation">Write</Item>
        <Item Key="RaiseErrorIfClaimsPrincipalDoesNotExist">true</Item>
      </Metadata>
      <IncludeInSso>false</IncludeInSso>
      <InputClaims>
        <InputClaim ClaimTypeReferenceId="objectId" Required="true" />
      </InputClaims>
      <PersistedClaims>
        <PersistedClaim ClaimTypeReferenceId="objectId" />
        <PersistedClaim ClaimTypeReferenceId="extension_StatusFlag" DefaultValue="Active" />
      </PersistedClaims>
      <IncludeTechnicalProfile ReferenceId="AAD-Common" />
    </TechnicalProfile>

我的问题是,即使extension_StatusFlag具有MigratedNotActivated值,但该OrchestrationStep仍未执行。 extension_StatusFlag的值保持不变。似乎无法更新属性值。 注意:我已经确保extension_StatusFlag属性在Claim Bag中,因为当用户完成密码重置并发出Cookie时,可以在返回的Claim中看到该属性。

我希望它可以将属性值保存为Active,但它没有这样做。看起来好像是一起跳过了,根本没有调用技术资料。

2 个答案:

答案 0 :(得分:1)

总结了@chrispadgett提出的答案,并且效果很好。如果有人需要参考,那将很容易。 您可以仅在编排步骤

下使用
<OrchestrationStep Order="3" Type="ClaimsExchange">
      <Preconditions>
        <Precondition Type="ClaimEquals" ExecuteActionsIf="false">
          <Value>extension_StatusFlag</Value>
          <Value>MigratedNotActivated</Value>
          <Action>SkipThisOrchestrationStep</Action>
        </Precondition>
      </Preconditions>
      <ClaimsExchanges>
        <ClaimsExchange Id="Update_extension_StatusFlagToActive" TechnicalProfileReferenceId="AAD-UserWriteAccountStatusUsingObjectId" />
      </ClaimsExchanges>
    </OrchestrationStep> 

在该步骤中,您只需调用“编写技术资料”

  <TechnicalProfile Id="AAD-UserWriteAccountStatusUsingObjectId">
          <Metadata>
            <Item Key="Operation">Write</Item>
            <Item Key="RaiseErrorIfClaimsPrincipalDoesNotExist">true</Item>
          </Metadata>
          <IncludeInSso>false</IncludeInSso>
          <InputClaims>
            <InputClaim ClaimTypeReferenceId="objectId" Required="true" />
          </InputClaims>
          <PersistedClaims>
            <PersistedClaim ClaimTypeReferenceId="objectId" />
            <PersistedClaim ClaimTypeReferenceId="extension_StatusFlag" DefaultValue="Active" AlwaysUseDefaultValue="true" />
          </PersistedClaims>
          <IncludeTechnicalProfile ReferenceId="AAD-Common" />
        </TechnicalProfile>

注意:仅当您不想通过显示屏幕从用户那里收集任何信息时,此选项才适用。

答案 1 :(得分:0)

您必须将 AlwaysUseDefaultValue 属性添加到 PersistedClaim 元素:

<PersistedClaim ClaimTypeReferenceId="extension_StatusFlag" DefaultValue="Active" AlwaysUseDefaultValue="true" />

否则,如果 extension_StatusFlag 声明具有现有值(即MigratedNotActivated),则不会将其替换为新值。