Azure AD B2C 自定义策略:ConvertStringToPhoneNumberClaim 声明转换中的验证不起作用

问题描述 投票:0回答:1

我正在开发一个使用 B2C 自定义策略的应用程序。目前,我正在将包含用户电话号码的扩展属性替换为 Microsoft 的内置手机属性。与此相关,我尝试使用声明转换 ConvertStringToPhoneNumberClaim (https://learn.microsoft.com/en-us/azure/active-directory-b2c/phone-number-claims-transformations#convertstringtophonenumberclaim),其中接受两个字符串(代表电话号码和国家/地区代码)并验证电话号码。如果电话号码无效,则应返回错误消息;如果有效,则以有效格式返回电话号码数据类型的号码。

这个过程在几周前运行良好。例如,如果我尝试使用 +47111 作为电话号码进行注册,则会收到错误消息,因为 111 是无效的挪威号码。但是,如果我现在使用该号码注册,则注册完成,并且可以在 B2C 租户中找到该用户,电话号码为+47111。

TrustFrameworkExtensions.xml 文件的相关部分粘贴在下面。

移动索赔定义如下:

<ClaimType Id="mobile">
  <DisplayName>Mobile Phone</DisplayName>
  <DataType>phoneNumber</DataType>
</ClaimType>

声明转换本身与 Microsoft 文档(上面链接)中的完全相同。

<ClaimsTransformation Id="ConvertStringToPhoneNumber" TransformationMethod="ConvertStringToPhoneNumberClaim">
  <InputClaims>
    <InputClaim ClaimTypeReferenceId="phoneString" TransformationClaimType="phoneNumberString"/>
    <InputClaim ClaimTypeReferenceId="countryCode" TransformationClaimType="country"/>
  </InputClaims>
  <OutputClaims>
    <OutputClaim ClaimTypeReferenceId="mobile" TransformationClaimType="outputClaim"/>
  </OutputClaims>
</ClaimsTransformation>

调用声明转换的技术简介如下所示:

<TechnicalProfile Id="ConvertPhoneNumber">
  <DisplayName>Convert phone number</DisplayName>
  <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.ClaimsTransformationProtocolProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
  <OutputClaims>
    <OutputClaim ClaimTypeReferenceId="mobile"/>
  </OutputClaims>
  <OutputClaimsTransformations>
    <OutputClaimsTransformation ReferenceId="ConvertStringToPhoneNumber"/>
  </OutputClaimsTransformations>
  <UseTechnicalProfileForSessionManagement ReferenceId="SM-Noop"/>
</TechnicalProfile>

上面的技术简介在下面的技术简介中用作验证技术简介:

<TechnicalProfile Id="LocalAccountSignUpWithLogonEmail">
  <OutputClaims>
    <OutputClaim ClaimTypeReferenceId="givenName" Required="true" />
    <OutputClaim ClaimTypeReferenceId="surName" Required="true" />
    <OutputClaim ClaimTypeReferenceId="email" PartnerClaimType="Verified.Email" Required="true" />
    <OutputClaim ClaimTypeReferenceId="countryCode" Required="false" />
    <OutputClaim ClaimTypeReferenceId="phoneString" Required="false" />
    <OutputClaim ClaimTypeReferenceId="AffiliatedOrg" Required="false" />
    <OutputClaim ClaimTypeReferenceId="AffiliatedOrgContact" Required="false" />
    <OutputClaim ClaimTypeReferenceId="newPassword" Required="true" />
    <OutputClaim ClaimTypeReferenceId="reenterPassword" Required="true" />
    <OutputClaim ClaimTypeReferenceId="userPrincipalName" />
  </OutputClaims>
  <ValidationTechnicalProfiles>
    <ValidationTechnicalProfile ReferenceId="ConvertPhoneNumber" ContinueOnError="false">
      <Preconditions>
        <Precondition Type="ClaimsExist" ExecuteActionsIf="false">
          <Value>phoneString</Value>
          <Action>SkipThisValidationTechnicalProfile</Action>
        </Precondition>
      </Preconditions>
    </ValidationTechnicalProfile>
    <ValidationTechnicalProfile ReferenceId="AAD-UserWriteUsingLogonEmail" />
    <ValidationTechnicalProfile ReferenceId="SendNewUserToCrm" />
  </ValidationTechnicalProfiles>
</TechnicalProfile>

最后,TrustFrameworkBase.xml 中相应的技术简介如下所示:

<TechnicalProfile Id="LocalAccountSignUpWithLogonEmail">
  <DisplayName>Email signup</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.localaccountsignup</Item>
  </Metadata>
  <CryptographicKeys>
    <Key Id="issuer_secret" StorageReferenceId="B2C_1A_TokenSigningKeyContainer" />
  </CryptographicKeys>
  <InputClaims>
    <InputClaim ClaimTypeReferenceId="email" />
  </InputClaims>
  <OutputClaims>
    <OutputClaim ClaimTypeReferenceId="objectId" />
    <OutputClaim ClaimTypeReferenceId="email" PartnerClaimType="Verified.Email" Required="true" />
    <OutputClaim ClaimTypeReferenceId="newPassword" Required="true" />
    <OutputClaim ClaimTypeReferenceId="reenterPassword" Required="true" />
    <OutputClaim ClaimTypeReferenceId="executed-SelfAsserted-Input" DefaultValue="true" />
    <OutputClaim ClaimTypeReferenceId="authenticationSource" />
    <OutputClaim ClaimTypeReferenceId="newUser" />
    <OutputClaim ClaimTypeReferenceId="givenName" />
    <OutputClaim ClaimTypeReferenceId="surName" />
  </OutputClaims>
  <UseTechnicalProfileForSessionManagement ReferenceId="SM-AAD" />
</TechnicalProfile>

代码中与验证工作时唯一不同的部分是,我从 TrustFrameworkBase.xml 中的 LocalAccountSignUpWithLogonEmail 中删除了所有验证技术配置文件,并将它们放入 TrustFrameworkExtensions.xml 中相应的技术配置文件中。这样做是因为验证技术配置文件以错误的顺序执行。为什么电话号码验证不再起作用?

azure-ad-b2c azure-ad-b2c-custom-policy aad-b2c
1个回答
0
投票

如果您在 ValidationTechnicalProfile 中有一个输出声明,例如“移动”,则该声明也需要在调用它的 TP 中输出。

我不明白你在用“LocalAccountSignUpWithLogonEmail”做什么。您有两个同名的不同 TP。

B2C会尝试合并它们。不知道合并是什么样子。

给新的一个不同的名字。

© www.soinside.com 2019 - 2024. All rights reserved.