Я пытаюсь обновить значение одного из атрибутов расширения (extension_StatusFlag) в пути сброса пароля пользователя. Я хочу сделать это только тогда и только тогда, когда атрибут extension_StatusFlag имеет значение MigratedNotActivation. Может быть 4 возможных различных значения extension_StatusFlag.

Я добавил OrchestrationStep с предварительными условиями, чтобы проверить значение extension_StatusFlag, и если условие удовлетворяет, то вызывает только технический профиль для обновления значения свойства.

Добавили ниже шаг OrchestrationStep в пути пользователя PasswordReset

<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 имеет значение MigratedNotActivation, но этот OrchestrationStep не выполняется. Значение extension_StatusFlag остается неизменным. Похоже, он не может обновить значение атрибута. Примечание. Я позаботился о том, чтобы атрибут extension_StatusFlag находился в пакете с претензиями, потому что я вижу, что в возвращенных претензиях, когда пользователь завершил процедуру сброса пароля и выдается cookie

Я ожидаю, что он сохранит значение атрибута в Active, но он этого не делает. Похоже, он пропускает все это вместе, а не вызывает технический профиль.

0
Rupesh Kumar prasad 11 Апр 2019 в 18:20

2 ответа

Лучший ответ

Завершая ответ, который был предложен @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
Rupesh Kumar prasad 11 Апр 2019 в 23:07

Вы должны добавить атрибут AlwaysUseDefaultValue в элемент PersistedClaim :

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

В противном случае, если утверждение extension_StatusFlag имеет существующее значение (т. Е. MigratedNotActivated), оно не будет заменено новым значением.

0
Chris Padgett 11 Апр 2019 в 22:01