SSO:单点登录(Single Sign-On)
简介
只登录一次,后续访问多个受保护系统时,不再重复输入用户名和密码。
SSO 的登录过程,本质上是一次“凭证交换”:通过认证中心(AAM),获取一次性认证凭证。使用一次性认证凭证,换取一个可在后续请求中复用的身份上下文,该上下文通常通过 Cookie 或 Authorization 机制体现。
流程
- 访问业务系统(未登录)
- 跳转认证中心
- 已登录,直接到第四步
- 未登录,展示登录界面
- 认证中心完成登录
- 带凭证跳回业务系统
- 业务系统校验(业务系统向认证中心校验ticket)
- 访问业务系统(已登录)
PS
- 为什么“一次性凭证”必须是一次性的?
答: 如果一次性凭证不是一次性的,SSO 在完全不安全。一次性凭证本质上是“登录成功的临时证明”。
如果他被重复利用,攻击者拿到凭证就可以你的完整登录状态。
因此,凭证一般是“一次性”+“短时有效(几十秒)”
- 为什么 SSO 强制用 302,而不是 200?
答: 如果用200,认证中心返回200后,客户端仍然停留在认证中心域,Cookie也只能属于当前域。
使用302后,强制客户端对另一个 URL 发起一次全新的请求,这样才能完成:
- 客户端访问业务系统
- 携带一次性凭证
- 业务系统完成校验
- 建立自己的登录态
- 为什么 POST 登录后,被 302 成 GET?
答: POST 只用于“提交凭证”,登录完成后,系统必须回到一个“幂等、安全、可重放”的 GET 资源访问。
即是Post/Redirect/Get(PRG)模式,刷新安全,地址干净,状态清楚,GET可缓存。