Как я могу прочитать мобильное значение из пользовательской записи B2C и преобразовать его в strongAuthenticationPhoneNumber? - PullRequest
0 голосов
/ 19 июня 2019

Мне необходимо программно создавать учетные записи пользователей Azure B2C.В отдельном хранилище пользовательских данных я храню соответствующую информацию о пользователях, которые мне нужно настроить в B2C, включая номер их мобильного телефона, по которому мы с ними уже общались.

Мое бизнес-требование заключается в том, чтобы этот мобильный телефонномер телефона используется в качестве вторичного фактора при первом входе пользователя в систему при сбросе логина / пароля.У меня есть первоначальный опыт входа в систему, который использует созданный извне токен JWT, чтобы перевести пользователя в пользовательское путешествие пользователя, где они могут впервые установить пароль.

Я понимаю, что пока невозможно установитьномер мобильного телефона Azure MFA через Graph API или PowerShell.(Это все еще правда?).Поэтому B2C просит пользователя ввести свой номер мобильного телефона в примерном техническом профиле PhoneFactor-InputOrVerify.Это дыра в безопасности, поскольку вы можете просто ввести любой номер мобильного телефона и проверить этот номер.

Я могу легко программно добавить номер пользователя в какое-то другое поле, например, в поле мобильного телефона в записи пользователя.

Вопрос 1. Есть ли способ прочитать мобильное значение учетной записи пользователя и представить его в Техническом профиле, как если бы это было значение strongAuthenticationPhoneNumber или Verified.strongAuthenticationPhoneNumber?

Вопрос 2. Это дажеотличная идея?Я полагаю, что есть веские причины не делать этого, но я не могу понять, какими они могут быть.

Я пытался создать новые ClaimTypes, читая значение поля 'mobile', создавая ClaimsTranfromations, чтобы попытатьсязаявка на мобильное устройство является заявкой strongAuthenticationPhoneNumber и, как правило, пытается «обмануть» B2C, думая, что это фактическое число, сохраненное в хранилище данных MFA.

Это стандартный технический профиль PhoneFactor-InputOrVerify отthe starterpack:

<ClaimsProvider>
  <DisplayName>PhoneFactor</DisplayName>
  <TechnicalProfiles>
    <TechnicalProfile Id="PhoneFactor-InputOrVerify">
      <DisplayName>PhoneFactor</DisplayName>
      <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.PhoneFactorProtocolProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
      <Metadata>
        <Item Key="ContentDefinitionReferenceId">api.phonefactor</Item>
        <Item Key="ManualPhoneNumberEntryAllowed">true</Item>
      </Metadata>
      <CryptographicKeys>
        <Key Id="issuer_secret" StorageReferenceId="B2C_1A_TokenSigningKeyContainer" />
      </CryptographicKeys>
      <InputClaimsTransformations>
        <InputClaimsTransformation ReferenceId="CreateUserIdForMFA" />
      </InputClaimsTransformations>
      <InputClaims>
        <InputClaim ClaimTypeReferenceId="userIdForMFA" PartnerClaimType="UserId" />
        <InputClaim ClaimTypeReferenceId="strongAuthenticationPhoneNumber" />
      </InputClaims>
      <OutputClaims>
        <OutputClaim ClaimTypeReferenceId="Verified.strongAuthenticationPhoneNumber" PartnerClaimType="Verified.OfficePhone" />
        <OutputClaim ClaimTypeReferenceId="newPhoneNumberEntered" PartnerClaimType="newPhoneNumberEntered" />
      </OutputClaims>
      <UseTechnicalProfileForSessionManagement ReferenceId="SM-MFA" />
    </TechnicalProfile>

  </TechnicalProfiles>
</ClaimsProvider>

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

1 Ответ

1 голос
/ 20 июня 2019

У вас есть несколько вариантов:

  1. Вы можете добавить заявление strongAuthenticationPhoneNumber к тому же JWT, который используется для входящего потока, и запросить проверку этого номера телефона во время этого входящего потока.
  2. Вы можете сопоставить заявку strongAuthenticationPhoneNumber для технического профиля PhoneFactor-InputOrVerify из свойства mobile (или свойства расширения) пользователь объект.

Для варианта 1 входящий пользовательский маршрут должен записать проверенный номер телефона в объект пользователя , без предварительного условия newPhoneNumberEntered :

<OrchestrationStep Order="8" Type="ClaimsExchange">
  <ClaimsExchanges>
    <ClaimsExchange Id="AADUserWriteWithObjectId" TechnicalProfileReferenceId="AAD-UserWritePhoneNumberUsingObjectId" />
  </ClaimsExchanges>
</OrchestrationStep>

Для варианта 2 вы можете сопоставить требование strongAuthenticationPhoneNumber из свойства mobile следующим образом:

<InputClaims>
  <InputClaim ClaimTypeReferenceId="userIdForMFA" PartnerClaimType="UserId" />
  <InputClaim ClaimTypeReferenceId="mobile" PartnerClaimType="strongAuthenticationPhoneNumber" />
</InputClaims>
...