如何从 B2C 用户记录中读取移动值并将其转换为 strongAuthenticationPhoneNumber?

How can I read the mobile value from a B2C user record and transform it to a strongAuthenticationPhoneNumber?

我需要以编程方式创建 Azure B2C 用户帐户。在一个单独的用户数据存储中,我保存了我需要在 B2C 中设置的用户的相关信息,包括他们的手机 phone 号码,我们已经通过这些号码与他们进行了沟通。

我的业务需求是此手机 phone 号码在用户首次 login/password 重置体验期间用作次要因素。我有一个初始登录体验,它使用外部创建的 JWT 令牌将用户带到自定义用户旅程,他们可以在其中首次设置密码。

我了解到目前还无法通过 Graph API 或 PowerShell 设置 Azure MFA 手机号码。 (这仍然是真的吗?)。因此,B2C 要求用户在示例 PhoneFactor-InputOrVerify 技术配置文件中输入他们的手机号码。这是一个安全漏洞,因为您可以在那里输入任何手机号码并验证该号码。

我可以轻松地以编程方式将用户号码添加到其他字段 - 例如用户记录上的移动字段。

问题一。 有没有办法读取用户帐户移动值并将其呈现给技术配置文件,就好像它是 strongAuthenticationPhoneNumber 值或 Verified.strongAuthenticationPhoneNumber?

问题二。 这是个好主意吗?我想有充分的理由不这样做,但我无法理解它们可能是什么。

我已经尝试创建新的 ClaimTypes,读取 'mobile' 字段值,创建 ClaimsTranfromations 以尝试使移动声明看起来像是 strongAuthenticationPhoneNumber 声明,并通常尝试 'spoof' B2C 到认为这是存储在 MFA 数据存储中的实际数字。

这是来自启动包的标准 PhoneFactor-InputOrVerify 技术简介:

<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. 您可以将 strongAuthenticationPhoneNumber 声明添加到用于入职流程的同一 JWT 并提示在此入职流程期间验证此 phone 号码。
  2. 您可以从 mobilePhoneFactor-InputOrVerify 技术配置文件映射到 strongAuthenticationPhoneNumber 声明=30=] 属性(或 user 对象的扩展 属性)。

对于选项 1,入门用户旅程应该 write the verified phone number to the user object,没有基于 newPhoneNumberEntered 的先决条件:

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

对于选项 2,您可以从 mobile 属性 映射到 strongAuthenticationPhoneNumber 声明,如下所示:

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