RaiseErrorIfClaimsPrincipalAlreadyExists работает только при операции Запись .
После операции чтения утверждение objectId заполняется, только если пользователь уже существует. Вам необходимо прочитать с помощью RaiseErrorIfClaimsPrincipalDoesNotExist = false , а затем вы можете поиграть с ClaimTransformations и ValidationTechnicalProfiles, чтобы заблокировать UserJourney, если objectId! = Null
EDIT: пример
EDIT: пример *
Я создал AAD-UserReadUsingEmailAddress-RaiseIfExists Технический профиль в провайдере утверждений AAD
<TechnicalProfile Id="AAD-UserReadUsingEmailAddress-RaiseIfExists">
<Metadata>
<Item Key="Operation">Read</Item>
<Item Key="RaiseErrorIfClaimsPrincipalDoesNotExist">false</Item>
</Metadata>
<IncludeInSso>false</IncludeInSso>
<InputClaims>
<InputClaim ClaimTypeReferenceId="email" PartnerClaimType="signInNames.emailAddress" Required="true" />
</InputClaims>
<OutputClaims>
<!-- Required claims -->
<OutputClaim ClaimTypeReferenceId="objectId" DefaultValue="NOTFOUND" />
<OutputClaim ClaimTypeReferenceId="objectIdNotFound" DefaultValue="NOTFOUND" AlwaysUseDefaultValue="true" />
</OutputClaims>
<OutputClaimsTransformations>
<OutputClaimsTransformation ReferenceId="AssertObjectIdObjectIdNotFoundAreEqual" />
</OutputClaimsTransformations>
<IncludeTechnicalProfile ReferenceId="AAD-Common" />
</TechnicalProfile>
Как видите, я использую претензию по электронной почте для поиска пользователя и вернуть только objectId. Обратите внимание на RaiseErrorIfClaimsPrincipalDoesNotExist = false и тот факт, что для objectId значение по умолчанию равно NOTFOUND. objectIdNotFound всегда будет NOTFOUND в соответствии с AlwaysUseDefaultValue = "true"
objectIdNotFound представляет собой простое строковое утверждение
<ClaimType Id="objectIdNotFound">
<DisplayName>Used for comparison</DisplayName>
<DataType>string</DataType>
</ClaimType>
AssertObjectIdObjectIdNotFoundAreEqual Output29 isAll после получения: *
<ClaimsTransformation Id="AssertObjectIdObjectIdNotFoundAreEqual" TransformationMethod="AssertStringClaimsAreEqual">
<InputClaims>
<InputClaim ClaimTypeReferenceId="objectId" TransformationClaimType="inputClaim1" />
<InputClaim ClaimTypeReferenceId="objectIdNotFound" TransformationClaimType="inputClaim2" />
</InputClaims>
<InputParameters>
<InputParameter Id="stringComparison" DataType="string" Value="ordinalIgnoreCase" />
</InputParameters>
</ClaimsTransformation>
Затем я использовал AAD-UserReadUsingEmailAddress-RaiseIfExists в качестве Технического профиля проверки в моем SelfAsserted TechnicalProfile
<TechnicalProfile Id="LocalAccountSignUpWithLogonEmail-CheckEmailAlreadyExists">
<DisplayName>Email signup</DisplayName>
<Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.SelfAssertedAttributeProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
<Metadata>
<Item Key="IpAddressClaimReferenceId">IpAddress</Item>
<Item Key="ContentDefinitionReferenceId">api.localaccountsignup</Item>
<Item Key="language.button_continue">Next</Item>
<Item Key="UserMessageIfClaimsTransformationStringsAreNotEqual">There is another user with this email address</Item>
</Metadata>
<InputClaims>
<InputClaim ClaimTypeReferenceId="email" />
</InputClaims>
<OutputClaims>
<OutputClaim ClaimTypeReferenceId="email" PartnerClaimType="Verified.Email" Required="true" />
</OutputClaims>
<ValidationTechnicalProfiles>
<ValidationTechnicalProfile ReferenceId="AAD-UserReadUsingEmailAddress-RaiseIfExists" />
</ValidationTechnicalProfiles>
</TechnicalProfile>
С этой настройкой, когда вы нажимаете «Продолжить», Технический профиль проверки выполняется и выдает ошибку, если уже есть пользователь с вставленным адресом электронной почты. Это происходит потому, что если пользователь найден, objectId будет guid, и он не будет равен "NOTFOUND". Вы можете изменить сообщение об ошибке с помощью метаданных UserMessageIfClaimsTransformationStringsAreNotEqual .
HTH, F.