Single Sign-on
SSO 是老生常谈的话题了, 但部分同学对 SSO 可能掌握的也是云里雾里, 一知半解. 本次手撕公司的 SSO 原理, 试图以一种简单, 流畅的形式为你提供有用的 SSO 原理.
按照本人一贯行文风格, 我们先说什么是 SSO, 为什么要提出 SSO?
SSO: 在多个系统中, 只需要登陆一次, 就可以访问其他相互信任的应用系统, 这个技术的提出解决了:
企业运行了多个服务, 而账号需要集中统一管理
终端用户登陆一次, 即可使用一个账户享受所有不同域名下服务.
SSO 与 CAS(Central Authentication System) 这个概念密切相关, 账户集中由某个服务管理, SSO 服务只负责登陆认证.
登陆认证与 [服务端在浏览器上写入的认证 Cookie] 密切相关, Cookie 有一系列重要属性: Domain,Path, Expiration,HttpOnly 决定了该 Cookie 在客户端的作用域, 作用范围, 有效时间, 有效操作方式
原理
用户首次访问 website1
1 用户访问 website1 系统, website1 系统需要认证, 用户当前没有登陆
2 website1 给客户端返回 302 重定向响应, 客户端重定向到 SSO 服务页
- # 交互过程确实是临时跳转, 下面传参 false, 返回 302 临时重定向响应
- context.Response.Redirect(ssoURL,false);
用户并没有登陆 SSO 系统, 所以 SSO 系统会返回登陆界面
3 用户在 SSO 登陆界面输出账户 / 密码
4 登陆成功, SSO 会在客户端写入一个 cookie for sso 并产生一个 301 重定向响应, 客户端将重定向到原 website1 地址, 该请求附带了 SSO 给与这次认证成功的 ticket
http://www.website1.com?ticket=XXXX-OOOO-XXXX-OOOO
5 website1 收到以上重定向请求, 解析 QueryString 中的 ticket, 向 SSO 做一次 ticket 验证; 验证通过向客户端写入本站的 cookie for website
6 上面第 5 步, 浏览器地址会显示: http://www.website1.com?ticket=XXXX-OOOO-XXXX-OOOO, 在本站验证通过之后, 最好再做一个重定向, 返回业务首页: www.website1.com, 本步骤不是 SSO 登陆的标准流程.
之后用户访问 website2
1 用户访问 website2, 用户在 website2 并没得到认证; 跳转回 SSO
2 SSO 服务检测到该 用户在 SSO 域下存在 Cookie for sso, 认定该用户已经登陆, 故跳转回 website2, 如上也会携带认证 ticket
3 如上, website2 收到 website2.com?ticket=XXXX-OOOO-XXXX-OOOO 请求, 会做一次 SSO 验证; 验证成功, 写入本站 cookie for website2
重难点解释
1 SSO 认证成功, 写入的 cookie for sso, 是登陆到其他系统的关键
2 website1 收到 SSO 认证成功的重定向请求, 解析出 ticket=XXXX-OOOO-XXXX-OOOO, 为什么还要做一次 SSO 验证?
因为 website1 收到的来自 SSO 的重定向请求地址, 有可能是伪造, 所以在 website1 中需要去 SSO 验证一次.
3 标准的 CAS 登陆流程有两次 302 客户端重定向, 分别由原站点 website1 和 SSO 启动.
理论上 整个流程由服务端重定向也是可以的 ?? 看官若发现有漏洞, 可在评论区回复.
4 退出 SSO 登陆, 要做两件事情:
- 向 SSO 发起 API 请求, 请求 SSO 删除用户在 SSO 域下的认证 cookie for sso
- 移除本站的 cookie for website1
5 每个 website, 至少需要如下 sso 配置
- "SsoOptions": {
- "BaseAddress": "https://sso-cas.sso.com", // 基地址
- "LoginPath": "/login", // sso 登陆地址
- "LogoutPath": "/api/logout", // 退出 sso 登陆的 API 地址
- "ValidateTGTPath": "/api/validate", // 验证 ticket 的 API 地址
- "UserInfoPath": "/api/v2/userinfo" // 从 sso 拿到登陆用户信息的 API 地址
- },
That' all, 这是自己对 SSO 登陆的一些理解, 本图文希望以流畅的思路记录 SSO 流程, 各位看官不要吃快餐, 知其然更知其所以然很关键.
来源: https://www.cnblogs.com/JulianHuang/p/11811239.html