1

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

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

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

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

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

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

我尝试创建新的 ClaimTypes,读取“mobile”字段值,创建 ClaimsTranfromations 以尝试使 mobile 声明看起来是 strongAuthenticationPhoneNumber 声明,并且通常尝试“欺骗”B2C 认为这是存储在MFA 数据存储。

这是 starterpack 中的标准 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>

我可以提供我之前提到的自定义用户旅程的更多代码示例,但我认为这对解决这个问题没有帮助。

4

1 回答 1

1

你有几个选择:

  1. 您可以将strongAuthenticationPhoneNumber声明添加到用于入职流程的同一 JWT,并在此入职流程期间提示验证此电话号码。
  2. 您可以从用户对象的移动属性(或扩展属性)映射到PhoneFactor-InputOrVerify技术配置文件的strongAuthenticationPhoneNumber声明。

对于选项 1,入职用户旅程应将已验证的电话号码写入用户对象,而不需要基于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>
于 2019-06-20T03:44:10.807 回答