Azure B2C: сравните пароль пользователя в процессе сброса пароля с префиксом электронной почты, используя метод преобразования «CompareClaims»

#azure-ad-b2c #azure-ad-b2c-custom-policy

#azure-ad-b2c #azure-ad-b2c-пользовательская политика

Вопрос:

Я пытаюсь выполнить требование к сложности пароля с помощью преобразования утверждений. Когда пользователь проходит путь сброса пароля, я хочу получить пароли, похожие на имя пользователя, путем сравнения утверждения NewPassword с атрибутом расширения, который содержит префикс электронной почты пользователя, например, jdoe в jdoe@contoso.com . Я не хочу использовать технический профиль REST.

Преобразование утверждений

   <ClaimsTransformation Id="CheckUserSuppliedPassword" TransformationMethod="CompareClaims">
    <InputClaims>
      <InputClaim ClaimTypeReferenceId="newPassword" TransformationClaimType="inputClaim1" />
      <InputClaim ClaimTypeReferenceId="userEmailPrefix" TransformationClaimType="inputClaim2" />
    </InputClaims>
    <InputParameters>
      <InputParameter Id="operator" DataType="string" Value="NOT EQUAL" />
      <InputParameter Id="ignoreCase" DataType="string" Value="true" />
    </InputParameters>
    <OutputClaims>
      <OutputClaim ClaimTypeReferenceId="SameAsEmailPrefix" TransformationClaimType="outputClaim" />
    </OutputClaims>
  </ClaimsTransformation>
  

Я добавил еще один технический профиль (MyLocalAccountCheckUserPassword), который вызывает преобразование. Этот технический профиль используется в качестве технического профиля проверки, на который ссылается технический профиль «LocalAccountWritePasswordUsingObjectId» поставщика утверждений локальной учетной записи. Ниже приведены оба технических профиля.

 <TechnicalProfile Id="MyLocalAccountCheckUserPassword">
  <DisplayName>Check User Password</DisplayName>
  <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.SelfAssertedAttributeProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
  <Metadata>
  <Item Key="RaiseErrorIfClaimsPrincipalDoesNotExist">true</Item>
  </Metadata>
  <IncludeInSso>false</IncludeInSso>
  <InputClaims>
    <InputClaim ClaimTypeReferenceId="newPassword" Required="true" />
    <InputClaim ClaimTypeReferenceId="reenterPassword" Required="false" />
  </InputClaims>
  
  <OutputClaims>
    <OutputClaim ClaimTypeReferenceId="newPassword"/>
    <OutputClaim ClaimTypeReferenceId="reenterPassword" />
    <OutputClaim ClaimTypeReferenceId="SameAsEmailPrefix"/>
  </OutputClaims>

  <OutputClaimsTransformations>
    <OutputClaimsTransformation ReferenceId="CheckUserSuppliedPassword"/>
  </OutputClaimsTransformations>
</TechnicalProfile>


    <TechnicalProfile Id="LocalAccountWritePasswordUsingObjectId">
      <DisplayName>Change password (username)</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" />

        <InputClaim ClaimTypeReferenceId="Verified.strongAuthenticationPhoneNumber" />

  </InputClaims>
  <OutputClaims>
    <OutputClaim ClaimTypeReferenceId="newPassword" Required="true" />
    <OutputClaim ClaimTypeReferenceId="reenterPassword" Required="true" />
    <OutputClaim ClaimTypeReferenceId="sameAsEmailPrefix" Required="true" />
  </OutputClaims>
  <ValidationTechnicalProfiles>
    <ValidationTechnicalProfile ReferenceId="AAD-UserWritePasswordUsingObjectId" />
    <ValidationTechnicalProfile ReferenceId="MyLocalAccountCheckUserPassword" />
  </ValidationTechnicalProfiles>
</TechnicalProfile>
  

На данный момент все, что я хочу, это проверить, что находится в том же утверждении EmailMessage (true / false), чтобы увидеть, прошло ли сравнение, как ожидалось. Итак, я добавил его в качестве выходного утверждения в техническом профиле проверяющей стороны. Но он не отображается как утверждение после завершения процесса сброса пароля. В конечном счете, я хочу показать пользователю сообщение об ошибке на экране входа в локальную учетную запись.

Пожалуйста, помогите.

Ответ №1:

Добавьте SameAsEmailPrefix в качестве выходного утверждения в разделе relyingparty вашего пользовательского файла политики.

Комментарии:

1. Добавьте его также в качестве выходного утверждения в LocalAccountWritePasswordUsingObjectId

2. Для выполнения общей логики вызовите преобразование утверждения перед AAD-UserWritePasswordUsingObjectId VTP. Затем добавьте другое преобразование TP утверждений, чтобы утверждать , что SameAsEmailPrefix имеет значение FALSE. Этот CT также может возвращать ошибку.

3. И хорошим эталонным примером для использования этих концепций является github.com/azure-ad-b2c/samples/tree/master/policies /…

4. Спасибо, Джас. Я смотрю на образец, и, похоже, он будет работать для меня. Однако мне еще предстоит уловить ту часть примера, которая фактически не позволяет пользователю устанавливать тот же (старый) пароль во время сброса пароля. Не могли бы вы указать мне направление?

5. Привет, Джас, спасибо за вашу помощь. Тем не менее, я все еще не могу запретить пользователю сбрасывать тот же пароль. Любая информация будет оценена.