#azure-ad-b2c
#azure-ad-b2c
Вопрос:
Я пытаюсь обновить значение одного из атрибутов расширения (extension_StatusFlag) в пользовательском путешествии для сброса пароля. Я хочу делать это только тогда и только тогда, когда атрибут extension_StatusFlag имеет значение MigratedNotActivated . Может быть 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 имеет значение MigratedNotActivated, этот этап оркестровки все равно не выполняется. Значение extension_StatusFlag остается прежним. Похоже, он не может обновить значение атрибута.
Примечание: я убедился, что атрибут extension_StatusFlag находится в пакете утверждений, потому что я вижу это в возвращаемых утверждениях, когда пользователь завершает сброс пароля и выдается файл cookie.
Я ожидаю, что он сохранит значение атрибута в Active, но он этого не делает. Похоже, что он пропускает все это вместе и вообще не вызывает технический профиль.
Ответ №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>
Примечание : Это применимо только в том случае, если вы не хотите собирать какую-либо информацию от пользователя, представляя экран.
Ответ №2:
Необходимо добавить атрибут AlwaysUseDefaultValue к элементу PersistedClaim:
<PersistedClaim ClaimTypeReferenceId="extension_StatusFlag" DefaultValue="Active" AlwaysUseDefaultValue="true" />
В противном случае, если утверждение extension_StatusFlag имеет существующее значение (т.Е. MigratedNotActivated
), Оно не заменяется новым значением.
Комментарии:
1. Привет, Крис — Спасибо за ответ. Я внес изменения и попробовал, но это не сработало. Похоже, что AAD-UserWriteAccountStatusUsingObjectId не вызывается. Согласно документации MS, если нет никаких выходных данных для представления пользователю, Azure AD B2C пропускает технический профиль. Вот ссылка — learn.microsoft.com/en-us/azure/active-directory-b2c /. … Я добавил утверждение executed-SelfAsserted-Input как true со множеством комбинаций, и это не помогло.
2. Привет @RupeshKumarprasad. Что произойдет, если вы обратитесь непосредственно с этапа согласования к техническому профилю AAD-UserWriteAccountStatusUsingObjectId , а не косвенно через технический профиль LocalAccountChange_extension_StatusFlagToActiveUsingObjectId?
3. Привет, Крис — это сработало. Я не уверен, почему это не сработало в первый раз, когда я пытался раньше, потому что я помню, что я напрямую вызывал запись технического профиля с этапа оркестровки, и это не сработало, вероятно, мне не хватало атрибута AlwaysUseDefaultValue.
4. Да, вы должны включить атрибут AlwaysUseDefaultValue. Кроме того, я считаю, что самоутверждающийся технический профиль не выполняется, если он не содержит никаких выходных утверждений. Я добавлю это к приведенному выше ответу…