在Azure ADB2C自定义策略中拆分MFA手机号为国家码与号码
Azure AD B2C自定义策略拆分MFA手机号
方案1:生成带空格的格式化手机号
原始手机号格式为(+91345234223),可通过声明转换提取括号内内容并插入空格分隔国家码与手机号:
- 添加声明定义
在ClaimsSchema节点下新增存储格式化手机号的声明:
<ClaimType Id="formattedMfaPhone"> <DisplayName>Formatted MFA Phone Number</DisplayName> <DataType>string</DataType> </ClaimType>
- 添加声明转换规则
在ClaimsTransformations节点下添加两个转换:
- 提取括号内的纯手机号(去除前后括号):
<ClaimsTransformation Id="ExtractPhoneFromParentheses" TransformationMethod="ExtractClaimByRegex"> <InputClaims> <InputClaim ClaimTypeReferenceId="strongAuthenticationPhoneNumber" TransformationClaimType="inputClaim" /> </InputClaims> <InputParameters> <InputParameter Id="regex" Value="\((.*)\)" /> <InputParameter Id="matchGroup" Value="1" /> </InputParameters> <OutputClaims> <OutputClaim ClaimTypeReferenceId="extractedPhone" TransformationClaimType="outputClaim" /> </OutputClaims> </ClaimsTransformation>
- 在国家码后插入空格(匹配
+开头的1-3位国家码,后续添加空格):
<ClaimsTransformation Id="InsertSpaceInPhone" TransformationMethod="ReplaceClaimValue"> <InputClaims> <InputClaim ClaimTypeReferenceId="extractedPhone" TransformationClaimType="inputClaim" /> </InputClaims> <InputParameters> <InputParameter Id="pattern" Value="(\+[0-9]{1,3})([0-9]+)" /> <InputParameter Id="replacement" Value="$1 $2" /> </InputParameters> <OutputClaims> <OutputClaim ClaimTypeReferenceId="formattedMfaPhone" TransformationClaimType="outputClaim" /> </OutputClaims> </ClaimsTransformation>
- 在技术配置文件中调用转换
找到处理MFA的TechnicalProfile(如PhoneFactor-Input或自定义MFA验证Profile),在OutputClaimsTransformations节点下添加上述转换:
<OutputClaimsTransformations> <OutputClaimsTransformation ReferenceId="ExtractPhoneFromParentheses" /> <OutputClaimsTransformation ReferenceId="InsertSpaceInPhone" /> </OutputClaimsTransformations>
- 将格式化手机号加入令牌
在RelyingParty节点的OutputClaims中添加:
<OutputClaim ClaimTypeReferenceId="formattedMfaPhone" />
方案2:拆分到独立的国家码和手机号声明
若需将国家码与手机号分别存入独立声明,调整如下:
- 添加声明定义
在ClaimsSchema新增两个声明:
<ClaimType Id="mfaCountryCode"> <DisplayName>MFA Country Code</DisplayName> <DataType>string</DataType> </ClaimType> <ClaimType Id="mfaPhoneNumber"> <DisplayName>MFA Phone Number</DisplayName> <DataType>string</DataType> </ClaimType>
- 添加声明转换规则
保留ExtractPhoneFromParentheses转换,新增两个提取规则:
- 提取国家码:
<ClaimsTransformation Id="ExtractCountryCode" TransformationMethod="ExtractClaimByRegex"> <InputClaims> <InputClaim ClaimTypeReferenceId="extractedPhone" TransformationClaimType="inputClaim" /> </InputClaims> <InputParameters> <InputParameter Id="regex" Value="(\+[0-9]{1,3})" /> <InputParameter Id="matchGroup" Value="1" /> </InputParameters> <OutputClaims> <OutputClaim ClaimTypeReferenceId="mfaCountryCode" TransformationClaimType="outputClaim" /> </OutputClaims> </ClaimsTransformation>
- 提取纯手机号(去除国家码):
<ClaimsTransformation Id="ExtractPurePhoneNumber" TransformationMethod="ExtractClaimByRegex"> <InputClaims> <InputClaim ClaimTypeReferenceId="extractedPhone" TransformationClaimType="inputClaim" /> </InputClaims> <InputParameters> <InputParameter Id="regex" Value="\+[0-9]{1,3}([0-9]+)" /> <InputParameter Id="matchGroup" Value="1" /> </InputParameters> <OutputClaims> <OutputClaim ClaimTypeReferenceId="mfaPhoneNumber" TransformationClaimType="outputClaim" /> </OutputClaims> </ClaimsTransformation>
- 调用转换并加入令牌
在TechnicalProfile的OutputClaimsTransformations中添加:
<OutputClaimsTransformations> <OutputClaimsTransformation ReferenceId="ExtractPhoneFromParentheses" /> <OutputClaimsTransformation ReferenceId="ExtractCountryCode" /> <OutputClaimsTransformation ReferenceId="ExtractPurePhoneNumber" /> </OutputClaimsTransformations>
然后在RelyingParty的OutputClaims中加入两个声明:
<OutputClaim ClaimTypeReferenceId="mfaCountryCode" /> <OutputClaim ClaimTypeReferenceId="mfaPhoneNumber" />
注意事项
- 正则
\+[0-9]{1,3}可覆盖大多数常见国家码场景,若有特定国家码需求,可调整正则匹配规则。 - 确保
strongAuthenticationPhoneNumber是ADB2C返回的原始MFA手机号声明,若策略中使用其他声明ID,需对应替换。
内容的提问来源于stack exchange,提问作者Chaudhary
相关产品推荐
相关产品推荐

