B2C / IEF Сброс пароля с именем пользователя

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

Я могу прочитать имя пользователя из AD, но не знаю, как проверить подтвержденный адрес электронной почты в учетной записи.

В настоящее время, если имя пользователя верное, для проверки можно использовать любой адрес электронной почты.

Технический профиль:

<TechnicalProfile Id="SA-LocalAccountDiscoveryUsingLogonName">
      <DisplayName>Reset password using logon name</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.localaccountpasswordreset</Item>
      </Metadata>
      <IncludeInSso>false</IncludeInSso>
      <OutputClaims>
        <OutputClaim ClaimTypeReferenceId="signInName" Required="true" />
        <OutputClaim ClaimTypeReferenceId="email" PartnerClaimType="Verified.Email" Required="true" />
        <OutputClaim ClaimTypeReferenceId="objectId" />
        <OutputClaim ClaimTypeReferenceId="userPrincipalName" />
      </OutputClaims>
      <ValidationTechnicalProfiles>
        <ValidationTechnicalProfile ReferenceId="AAD-UserReadUsingLogonName" />
      </ValidationTechnicalProfiles>
    </TechnicalProfile>

Технический профиль валидации:

<TechnicalProfile Id="AAD-UserReadUsingLogonName">
      <Metadata>
        <Item Key="Operation">Read</Item>
        <Item Key="RaiseErrorIfClaimsPrincipalAlreadyExists">true</Item>
      </Metadata>
      <InputClaims>
        <InputClaim ClaimTypeReferenceId="signInName" PartnerClaimType="signInNames.userName" Required="true" />
      </InputClaims>
      <OutputClaims>
        <OutputClaim ClaimTypeReferenceId="objectId" />
        <OutputClaim ClaimTypeReferenceId="userPrincipalName" />
      </OutputClaims>
      <IncludeTechnicalProfile ReferenceId="AAD-Common" />
      <UseTechnicalProfileForSessionManagement ReferenceId="SM-AAD" />
    </TechnicalProfile>

Путь пользователя:

<UserJourney Id="PasswordReset">
  <OrchestrationSteps>
    <!--Get user by username-->
    <OrchestrationStep Order="1" Type="ClaimsExchange">
      <ClaimsExchanges>
        <ClaimsExchange Id="PasswordResetUsingEmailAddressExchange" TechnicalProfileReferenceId="SA-LocalAccountDiscoveryUsingLogonName" />
      </ClaimsExchanges>
    </OrchestrationStep>

    <!--Reset password-->
    <OrchestrationStep Order="2" Type="ClaimsExchange">
      <ClaimsExchanges>
        <ClaimsExchange Id="NewCredentials" TechnicalProfileReferenceId="SA-LocalAccountPasswordReset" />
      </ClaimsExchanges>
    </OrchestrationStep>

    <!--Read remaining attributes of user-->
    <OrchestrationStep Order="3" Type="ClaimsExchange">
      <ClaimsExchanges>
        <ClaimsExchange Id="ReadUser" TechnicalProfileReferenceId="AAD-UserReadUsingObjectId" />
      </ClaimsExchanges>
    </OrchestrationStep>

    <!--Create token-->
    <OrchestrationStep Order="4" Type="SendClaims" CpimIssuerTechnicalProfileReferenceId="JwtIssuer" />
  </OrchestrationSteps>
  <ClientDefinition ReferenceId="DefaultWeb" />
</UserJourney>

person nyoung    schedule 12.12.2017    source источник
comment
Привет @nyoung Не могли бы вы пояснить, что вы хотите предложить конечному пользователю ввести свое имя пользователя и адрес электронной почты, подтвердить этот адрес электронной почты, отправив ему проверочный код, а затем убедиться, что адрес электронной почты связан с именем пользователя ?   -  person Chris Padgett    schedule 13.12.2017
comment
Да, это то, чем я хочу заниматься.   -  person nyoung    schedule 13.12.2017
comment
Сохраняете ли вы адрес электронной почты в свойстве пользователя, которое может быть запрошено API-интерфейсом Azure AD Graph?   -  person Chris Padgett    schedule 15.12.2017
comment
Да, электронная почта фиксируется во время регистрации и сохраняется в свойстве strongAuthenticationEmailAddress пользователя.   -  person nyoung    schedule 15.12.2017


Ответы (1)


Если вы укажете адрес электронной почты как в свойствах «otherMails», так и «strongAuthenticationEmailAddress» во время политики регистрации, то вы сможете проверить, связан ли адрес электронной почты с именем пользователя во время политики сброса пароля с помощью REST API.

Этот REST API должен быть объявлен как поставщик утверждений:

<ClaimsProvider>
    <DisplayName>REST APIs</DisplayName>
    <TechnicalProfiles>
        <TechnicalProfile Id="RestApi-CheckUser">
            <DisplayName>Check User REST API</DisplayName>
            <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.RestfulProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
            <Metadata>
                <Item Key="ServiceUrl">Insert the REST API endpoint URL</Item>
                <Item Key="AuthenticationType">None</Item>
                <Item Key="SendClaimsIn">Body</Item>
            </Metadata>
            <InputClaims>
                <InputClaim ClaimTypeReferenceId="signInName" />
                <InputClaim ClaimTypeReferenceId="email" />
            </InputClaims>
            <UseTechnicalProfileForSessionManagement ReferenceId="SM-Noop" />
        </TechnicalProfile>
    </TechnicalProfiles>
</ClaimsProvider>

REST API может запрашивать объект пользователя по свойствам signInNames и otherMails с помощью Azure AD Graph API (вы не можете прочитать свойство strongAuthenticationEmailAddress с помощью этого Graph API) и, как описано в пошаговое руководство по REST API, затем верните 200 OK, если адрес электронной почты связан с именем пользователя, или 409 Conflict, если нет.

Затем технический профиль REST API можно вызвать в качестве технического профиля проверки из технического профиля «SA-LocalAccountDiscoveryUsingLogonName»:

<TechnicalProfile Id="SA-LocalAccountDiscoveryUsingLogonName">
    <ValidationTechnicalProfiles>
        <ValidationTechnicalProfile ReferenceId="RestApi-CheckUser" />
        <ValidationTechnicalProfile ReferenceId="AAD-UserReadUsingLogonName" />
    </ValidationTechnicalProfiles>
</TechnicalProfile>

Если технический профиль «RestApi-CheckUser» возвращает 200 OK, то вызывается технический профиль «AAD-UserReadUsingLogonName», и конечный пользователь может продолжить сброс пароля. Если технический профиль «RestApi-CheckUser» возвращает 409 Conflict, то технический профиль «AAD-UserReadUsingLogonName» не вызывается, и конечный пользователь не может продолжить работу.

person Chris Padgett    schedule 14.12.2017