我正在开发一个使用 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 中相应的技术配置文件中。这样做是因为验证技术配置文件以错误的顺序执行。为什么电话号码验证不再起作用?
如果您在 ValidationTechnicalProfile 中有一个输出声明,例如“移动”,则该声明也需要在调用它的 TP 中输出。
我不明白你在用“LocalAccountSignUpWithLogonEmail”做什么。您有两个同名的不同 TP。
B2C会尝试合并它们。不知道合并是什么样子。
给新的一个不同的名字。