本文描述了基于认证中心的单点登录系统,采用独立的认证中心是实现企业单点登录非常好的应用实践。
CAS需要较高的集成度,在需要实现单点登录的系统,配置认证中心地址,和认证中心交互获得用户信息。
文尾比较了,通过子域名方式和Oauth方式实现单点登录系统的差别。
基于认证中心的单点登录原理是基于ticket实现。CAS系统就是一个集成化程度很好的基于ticket单点登录系统。
单点登录步骤如下:
1.用户访问应用App Server,AppServer首先要判断用户是否登录。在之间的文章,论证过Http协议的无状态属性,用户的登录状态采用cookie保存session_id,通过session_id获得session信息,session保存在AppServer中,从AppServer内存中获得Http协议的会话信息。
2.当采用CAS结构时,需要配置CAS server,并在App Server上集成CAS client。CAS server要独立配置,CAS client部署在App Server上。App client 集成CAS client sdk,在配置文件中设置拦截器和CAS server的地址,实现认证访问。
(问题:在拦截器中,要过滤session,存储CAS server 返回的信息,这部分代码应该由用户完成)
3.如果用户没有登录,采用http 302协议重定向到认证服务中心CAS_Server,在CAS_Server完成用户的登录(以用户名密码方式验证用户),CAS_Server生成TGT (Ticket Granting Ticket),并保存在cookie中,TGT的cookie domain为CAS_Server,并返回App的ticket ST。
4.将2中的App Server定义为App_1,重定向时App_1 URL作为参数拼接在CAS_Server URL中,CAS server会保存App_1和用户信息。拼接App_1 URL和ST,使用户重定向到App_1。
5.App_1在拦截器中获取用户的ST_1,用ST_1向CAS_server换取用户信息,并完成本地登录local login。此时,用户完成全局global login和本地login。
6.当用户访问App_2时,App_2通过判断是否存在本地登录local login(此时用户完成了全局login,但没有本地login),会重定向到CAS server,CAS server通过cookie中的TGT实现身份认证,并给用户颁发ST_2,返回302重定向信息返回App_2。
7.App_2获取用户ST_2(CAS server返回重定向信息时,将ST2拼接在App_2 URL中),App_2向CAS server验证ST2信息,并获取用户信息,完成用户在App_2中的local login。
单点登出步骤:
1.用户在App_1完成登出操作。
2.App_1向CAS Server发出请求进行全局登出。
3.CAS Server向App_2发出消息,完成用户登出。
代理模式
代理模式是为了解决App_1代理用户身份访问App_2的资源。为什么会有这个feature,或者说这个需求从哪里来?
- App_2已经被CAS client保护了,App_1无法直接访问App_2资源信息。
- App_2不信任App_1,安全要求必须要获得用户身份。
一般情况,在App_1和App_2之间通过接口直接访问。
CAS缺点&问题:
1.CAS 必须配置Https,通过url传递ST,ST没有被加密。在安全性上,ST的只能使用一次,并且只有较短的生存时间。
2.应用系统建成后,改造代价比较大。适合初建系统。
和Oauth系统的比较
1.登录方式是一致的,在Oauth服务处登录,重定向到App url+code ,App通过code获取用户信息。
2.Oauth采用jwt返回App,那么用户不能完成单点登出操作。
3.Oauth用作Proxy模式,jwt中获取token,通过token获取Api权限。Token是加密的。
4.Oauth通常应用在三方登录,为用户提供方便的登录方式,系统本身还是具有用户管理功能。
子域名方式比较:
1.子域名通过在父域名上设置全局cookie,标志用户身份。
2.子域名方式,需要全域共享session。
参考资料:
- 单点登录原理与简单实现 https://www.cnblogs.com/ywlaker/p/6113927.html
- 文档 https://apereo.github.io/cas/5.0.x/protocol/CAS-Protocol.html#proxy-web-flow-diagram
- 什么是单点登录(SSO) https://juejin.im/post/5cdd42f9518825693f1ebf8d
不同域名的处理方法
参考:
- Taobao SSO 跨域登录过程解析 https://yanmingming.wordpress.com/2017/12/12/taobao-sso-%E8%B7%A8%E5%9F%9F%E7%99%BB%E5%BD%95%E8%BF%87%E7%A8%8B%E8%A7%A3%E6%9E%90/
- 淘宝跨域获取Cookie分析 https://www.oschina.net/question/4873_18517
- 啥是单点登陆?淘宝和天猫是如何实现同时登陆的? https://cloud.tencent.com/developer/article/1443036
- localStorage和cookie的跨域解决方案 https://www.haorooms.com/post/kuayu_localstorage_cookie
- 跨域问题导致设置 cookie 不生效 https://zhuanlan.zhihu.com/p/35618124
研究方向:HTTPS的服务配置,国密HTTPS的配置。