如何移除/重置Azure AD B2C用户的MFA选项?
我们当前使用Custom Policies管理注册/登录、重置密码的用户流程,已启用MFA Phone/SMS选项。流程是先通过User Flow配置,再导出为Custom Policy以满足OOTB User Flow无法实现的需求。
现在需要为应用添加用户重置MFA选项的功能:在用户个人资料页设置按钮,内部调用MS Graph API的GET /users/{id}/authentication/phoneMethods接口获取数据,再调用DELETE /users/{id}/authentication/phoneMethods/{id}接口移除,让用户下次登录时重新添加MFA选项。
但遇到以下问题:调用上述GET接口返回空结果,调用GET /users/{id}/authentication/methods仅返回密码认证方式。经查,默认Azure AD B2C MFA实现将数据写入“旧认证方法”界面,此前微软官方回复暂无解决办法,距该回复已过去约8个月,现咨询两个问题:
- 是否可修改Custom Policy,将手机号写入“新认证方法”以支持原方案?测试显示在国家码与手机号间加空格可生效,但我们不熟悉Custom Policy配置。
- 是否可通过MS Graph API读取Azure AD B2C的“旧认证方法”数据?
注:已验证StackOverflow提到的临时方案(POST虚拟MFA手机号再DELETE)有效,但仍希望获得正规解决方案。
问题1:修改Custom Policy将手机号写入新认证方法
可以通过自定义策略的声明转换(Claims Transformation)和技术配置文件(Technical Profile)实现,核心是确保存储的手机号格式符合新认证方法的要求(国家码与手机号间加空格),具体步骤如下:
- 添加声明转换规则处理手机号格式
在自定义策略的<ClaimsTransformations>节点下,添加转换规则为国家码和手机号插入空格:
<ClaimsTransformation Id="FormatPhoneNumberForNewAuthMethod" TransformationMethod="FormatStringClaim"> <InputClaims> <InputClaim ClaimTypeReferenceId="countryCode" TransformationClaimType="inputClaim1" /> <InputClaim ClaimTypeReferenceId="phoneNumber" TransformationClaimType="inputClaim2" /> </InputClaims> <InputParameters> <InputParameter Id="stringFormat" DataType="string" Value="{0} {1}" /> </InputParameters> <OutputClaims> <OutputClaim ClaimTypeReferenceId="formattedPhoneNumber" TransformationClaimType="outputClaim" /> </OutputClaims> </ClaimsTransformation>
同时需确保策略中已定义countryCode、phoneNumber、formattedPhoneNumber这几个声明类型(ClaimType)。
- 修改MFA注册的技术配置文件
找到负责MFA手机号注册的自断言页面技术配置文件(如SelfAsserted-LocalAccountSignUpWithLogonEmail),在其<OutputClaimsTransformations>中添加上述转换规则,确保存储到目录的是格式化后的手机号:
<OutputClaimsTransformations> <OutputClaimsTransformation ReferenceId="FormatPhoneNumberForNewAuthMethod" /> </OutputClaimsTransformations>
另外,更新存储用户数据的技术配置文件(如AAD-UserWriteUsingLogonEmail),将formattedPhoneNumber作为mobile或otherMobile属性写入目录(根据业务需求选择对应属性)。
- 测试验证
部署修改后的Custom Policy,让用户重新注册或更新MFA手机号,之后调用GET /users/{id}/authentication/phoneMethods接口,即可返回正确的手机号数据,此时可正常调用DELETE接口重置MFA。
问题2:通过MS Graph API读取旧认证方法数据
目前Azure AD B2C的“旧认证方法”(传统MFA存储的手机号)无法通过MS Graph API直接读取,微软官方尚未开放对应接口权限。即使距离此前的官方回复已过去8个月,当前官方文档仍未提及相关支持,因此暂时没有正规的Graph API途径获取这部分数据。
补充说明
你提到的临时方案(POST虚拟手机号再DELETE)虽能绕开读取问题,但存在操作冗余。若优先考虑正规方案,建议采用问题1中的Custom Policy修改方案,从根源上让MFA数据存储到新认证方法体系中,后续的Graph API操作即可完全符合预期。
内容的提问来源于stack exchange,提问作者Kiran Ramaswamy

