非Azure API基于Azure B2C令牌的SFA/MFA验证及适配方案问询
Azure B2C 认证级别验证与资源访问处理方案
我来帮你逐个梳理这些问题的解决方案,都是基于Azure B2C的实际最佳实践:
1. 访问令牌 vs ID令牌:能否验证用户认证级别?
你不需要局限于ID令牌——Azure B2C可以配置为在访问令牌中嵌入认证方式相关的声明,同样能用来验证用户的认证级别:
- 核心声明是
amr(Authentication Methods References):这个数组会记录用户完成认证时使用的方法,比如纯密码登录(SFA)会包含pwd值,完成MFA后会额外添加mfa值。 - 配置方式:在你的Azure B2C用户流或自定义策略中,确保将
amr声明添加到访问令牌的输出声明里(默认ID令牌会包含,但访问令牌需要手动配置)。 - 当然ID令牌默认也携带
amr声明,如果你的架构更依赖ID令牌做身份校验,用它也完全没问题。
2. 用户仅完成SFA时访问MFA端点的正确响应
当用户用SFA令牌访问需要MFA的资源时,API应该返回:
- HTTP 401 Unauthorized状态码
- 响应头中添加
WWW-Authenticate字段,明确告知客户端需要更高等级的认证:WWW-Authenticate: Bearer error="insufficient_authentication", error_description="Multi-factor authentication is required to access this resource"
客户端收到这个响应后,应该引导用户跳转至Azure B2C的MFA认证流程(比如指定对应MFA用户流的策略ID),获取包含MFA认证声明的新令牌后,再重新发起请求。
3. 用作用域区分认证级别是否可行?
你提到的把sfa/mfa设为作用域的思路,其实不符合OAuth2作用域的设计初衷——作用域代表的是资源的权限范围,而非用户的认证级别。不过Azure B2C有更合适的方案:
- 分用户流/策略处理:创建两个独立的用户流:一个仅要求SFA(比如
B2C_1_signup_signin_sfa),另一个强制MFA(比如B2C_1_signup_signin_mfa)。客户端请求不同资源时,指定对应的用户流ID(通过认证请求的p参数),只有用户完成对应级别的认证,才能获取到有效令牌。 - 自定义声明增强:在自定义策略中添加自定义声明(比如
auth_level,值为sfa或mfa),并将其包含到访问令牌中。API端直接验证这个声明,判断用户是否满足资源的认证要求。 - 这种方式的优势是:认证级别与用户流绑定,客户端可以精准引导用户完成对应认证,API端只需验证令牌中的声明即可,无需依赖作用域来区分认证等级。
内容的提问来源于stack exchange,提问作者user2047485
相关产品推荐
相关产品推荐

