AdminGetUser返回userMFASettingList为空,如何获取Cognito用户MFA配置?
问题描述
我通过SDK查询特定Cognito用户的MFA配置,当前逻辑依赖AdminGetUser API的userMFASettingList和preferredMfaSetting字段。根据AWS文档,userMFASettingList代表用户激活的MFA选项(可选值为SMS_MFA、SOFTWARE_TOKEN_MFA),mfaOptions字段已被弃用。但测试启用强制SMS MFA的用户池时,userMFASettingList为空,我却能通过Cognito托管UI完成MFA挑战并成功登录。请问这是Bug吗?应该采用什么逻辑?
回答
这不是Bug,核心是userMFASettingList和池级强制MFA配置是完全独立的两个概念:
userMFASettingList记录的是用户主动激活并完成验证的可选MFA方式——比如用户自行开启软件令牌MFA并完成二维码绑定验证,这个字段才会有值。- 而用户池开启强制SMS MFA属于池级规则,只要用户的
phone_number_verified属性为true(手机号已验证),Cognito会自动触发SMS MFA挑战,无需用户主动激活该选项,所以userMFASettingList会显示为空。
正确的判断逻辑需要结合三个维度:
- 用户池的MFA规则:通过
DescribeUserPoolAPI获取用户池的MFA配置,比如是否强制SMS MFA、允许的MFA类型有哪些。 - 用户的手机号验证状态:在
AdminGetUser返回的UserAttributes中查看phone_number_verified字段。如果值为true,且用户池强制SMS MFA,那么该用户登录时必须完成SMS MFA挑战。 - 用户主动激活的MFA方式:
userMFASettingList记录用户额外开通的MFA选项(比如软件令牌),preferredMfaSetting则是用户设置的默认优先使用的MFA方式。
举个实际场景例子:
- 场景1:用户池强制SMS MFA,用户手机号已验证 →
userMFASettingList为空,但登录时会自动触发SMS MFA挑战。 - 场景2:用户在场景1基础上主动激活了软件令牌MFA →
userMFASettingList会包含SOFTWARE_TOKEN_MFA,此时用户可以选择用SMS或软件令牌完成MFA,若设置了preferredMfaSetting,则优先使用该方式。
总结:不能仅靠userMFASettingList判断用户是否需要MFA,必须结合用户池配置、用户手机号验证状态综合分析。
内容的提问来源于stack exchange,提问作者Danilo Arcidiacono
相关产品推荐
相关产品推荐

