摘要
- 某项操作的风险可能到请求抵达时才显现,资源服务因此需要重新提出认证要求;这个决定有价值,但不意味着履行条件已经具备。
- 新发出一个令牌,不等于完成了一次符合要求的用户认证。没有实际变化的重试,可能只把同一个拒绝再次交给用户。
- 应把触发用户交互视为需要治理的能力:说明可行路径、停止条件、披露边界,以及设备、恢复和支持成本由谁承担。
规则加在一端,麻烦出现在另一端
假设一个业务团队决定,提高某类敏感操作的认证要求。改动在自己的服务里看起来很小:条件不够,就拒绝,并要求重新认证。但接下来需要找设备、完成注册、恢复账号的人,可能在另一个地方;需要解释为什么登录成功仍然不能操作的团队,也未必参与了这项决定。
这是一个规划场景,不是对某次真实故障的描述。它揭示了一个容易被“加强安全”四个字遮住的事实:决定增加要求的人,不一定提供满足要求的手段,也不一定承担增加的工作。
资源服务当然有理由保留这一决定权。有些操作的具体风险,在最初发放令牌时还不知道。若要求身份系统提前猜中所有情境,反而会把判断放到信息不足的位置。问题不在于能否追加要求,而在于能否把本地的风险判断,无条件转化成别人的下一次中断。
2023 年 9 月发布的 RFC 9470给这种交互定义了共同语言:资源服务指出用户认证不足,并传回可接受的认证上下文或时间要求,客户端再向授权服务器发起请求。规范同时明确提醒,双方的政策可能形成用户无法满足的条件;触发交互的能力也可能遭到恶意资源服务滥用。因此,消息能够互通,不等于运营责任已经闭合。
“支持加强认证”离“用户能完成”还有多远
采购验收很容易停在功能层面。供应商展示一次更严格的认证流程,业务团队看到请求被接受,项目便拥有了“支持加强认证”的结论。
这个结论不能自动覆盖所有用户。一个事先准备好的管理员账号,不足以代表刚注册的人、正在恢复账号的人,或者无法使用惯常设备的人。列出产品支持哪些方法,也不能证明目标人群在当前环境下能够使用这些方法。
这并不是说遇到困难就应降低安全条件。真正需要补上的,是预先约定的可行路径:要求是什么,身份服务能证明什么,用户要具备哪些条件,做不到时去哪里。没有这些约定,所谓自动化可能只是把未解决的问题自动送到用户面前。
“加强”本身也容易误导。它像一把统一的尺子,让人以为只要多做一步,就必然比原先更合适。然而,某个服务需要的可能是一种特定上下文,另一个服务重视的则是近期发生的主动认证。不是所有方法都能放在一条通用阶梯上比较,也不是多一个因素就能替代所有政策条件。
请求一个结果,不等于已经得到结果
OpenID Connect Core区分自愿请求的认证上下文,以及在相应机制受支持时被指定为必需的具体上下文值。它也把认证时间要求,与是否向用户显示交互界面分别处理。
这类区别不是文字游戏。如果资源服务认为自己提出的是前置条件,身份服务却把它当作尽力满足的偏好,那么一次正常返回仍可能带回资源服务不接受的结果。
管理层不必记住每一个参数,但需要确保接口两端对“提出了什么”与“实际完成了什么”有同一理解。否则,身份团队可以合理地说认证流程成功,业务团队也可以合理地说认证条件不足,只有用户无法理解为什么成功之后还要再来一次。
这个问题不能靠更漂亮的成功页面解决。必须有一个负责评估实际结果的组件,也必须有一条诚实表达无法达到要求的路径。
有时,明确失败才是前进
设想某种认证上下文对这个用户并不可用。应用把要求再次转交,身份服务返回原有上下文,资源服务再次拒绝。如果没有条件发生变化,下一次循环并没有更充分的成功依据。
OpenID 关于无法满足认证要求的规范定义了相应失败信号,包括指定的必需认证上下文无法满足的情况。RFC 9470 针对它描述的访问令牌流程,建议把所请求的上下文视为成功完成请求所需的条件,以避免持续返回已经知道不够用的令牌。
规范中的建议,不等于为所有产品规定了同一个重试次数。何时继续、何时停止、何时转入人工支持,需要根据真实服务做出决定。
一个有用的追问是:下一次尝试之前,什么改变了?用户完成了设备注册、找回了必要设备,或者进行了符合条件的认证,都可能构成新的依据。什么都没变,只把同一段流程重新播放,则不能因为出现了新的请求编号就被当作进展。
停止徒劳循环,也不意味着放行。明确拒绝、提供获批替代路径,与悄悄绕过认证条件是两回事。良好的失败出口应保留安全边界,同时不要求用户凭反复点击去解决系统之间的政策矛盾。
令牌更新了,认证事件未必更新
新令牌尤其容易制造进展感。系统记录了新的发放时间,客户端收到成功响应,观察者便可能以为用户刚刚重新证明了身份。
JWT 访问令牌规范 RFC 9068将令牌发放时间与认证事件信息区分开来。由同一次授权响应派生的令牌,在相关刷新或交换过程中保留该事件信息;产生一个新对象,并不自动产生新的用户动作。该规范也要求客户端不要依赖读取访问令牌内部内容,因为发放方与资源服务可以改变令牌格式。
这给运营设计的启示很有限,也很重要:如果某条流程不能产生资源服务所需的认证事件,那么反复刷新令牌就不是有效恢复。需要确认的是事件与证据,而非对象的新旧。
由 RFC 7662 定义的令牌内省提供了另一种方式,让获得授权的资源服务查询令牌状态与元数据;RFC 9470 又为相应交互补充认证上下文和时间信息。令牌处于活动状态,仍不等于每个请求特有的条件都已满足。
无论信息装在令牌里,还是通过查询取得,责任分工都不应模糊:谁提供认证信息,谁判断它是否足够,谁决定用户需要做什么,谁确认预期操作最终完成。客户端不应靠临时解析令牌来弥补这些约定的缺失。
认证要求本身也会透露信息
更具体的拒绝信息,有助于合法客户端知道下一步该做什么。但要求也是从资源服务向外发送的信息。
如果某些要求只针对特定用户或操作出现,接收者可能据此推断其重要性。规范提出了这类潜在披露风险;它并没有证明某家系统已因此遭到攻击。管理层需要决定的是:帮助恢复所必需的信息,到哪一步才应交给什么样的调用者。
协议允许在验证令牌之前发出挑战,但这也意味着,尚未证明能够取得有效令牌的调用者,可能先知道资源的部分要求。允许一种处理顺序,并不等于已经替组织选择了最合适的披露政策。
排障数据也有同样的问题。解释认证失败,并不当然需要集中保存完整令牌与所有身份属性。能够区分“不支持所需上下文”与“网络传输失败”的诊断资料,应当与调查目的相称。否则,为了解决一次中断而收集的信息,可能形成另一笔隐私成本。
不要把提示次数当成安全成绩
认证提示增多,可能意味着一次合理的政策调整,也可能意味着集成有误或要求无法满足。数字相同,含义可以相反。
更有价值的观察对象,是用户是否在规定条件下完成了目标操作。未满足的要求、条件未变的重试、取消与获批恢复路径,应分别记录,而不是都合并成“安全验证已触发”。这些是本文提出的监测建议,不是某个部署的实测效果。
反过来,提示越少也不必然越好。如果减少中断的方式是删掉必要条件,顺畅并不证明设计正确。目标应是适度、可行、有明确出口的认证要求,而不是在“完全无摩擦”与“不断增加步骤”之间选择一个口号。
上线之前检查几种合法但不方便的情境,不能保证覆盖未来所有情况,却可以迫使各团队暴露假设。这个人没有常用设备时怎么办?注册尚未完成时怎么办?任务途中风险变化时怎么办?答案若只是“系统会再提示一次”,责任仍未落实。
会员简报
档案背景详情
使用相应会员等级登录,即可解锁完整简报与来源注释。
仅限 Strategic Circle
Strategic Circle
所有读者均可浏览。加入并登录后可解锁档案简报。
加入 Strategic Circle仅限 Leadership Alliance
Leadership Alliance
符合条件的 IP 资产所有者和管理层可登录查看 Leadership Alliance 简报。
加入 Leadership Alliance
