单点登录
一、SSO,单点登录(single sign on),是指在多系统应用群中登录一个系统,便可在其他所有系统中得到授权而无需再次登录,包括单点登录和单点注销。
二、单点登录需求:多套系统能够识别同一用户身份,并实时同步用户信息以使各个系统进行相应的权限控制。一般单点登录实现一个系统登录,其他系统即可登录;一个系统注销,其他系统也会注销;一个系统登录信息过期,其他系统的登录信息也会过期。
三、实际应用中,单点登录的最佳环境是:
用户在多套系统只有一个用户名和密码,即多套系统共享这一套用户名和密码,以及各应用系统采用的技术架构相同,域名后缀相同。
单点登录的最坏的环境是:
用户在多套系统有各自的用户名和密码,每个系统都各自存储了各自的用户信息,且每套系统采用的技术架构不同,域名后缀也不同。
四、SSO的两种架构与三种实现技术
从应用架构层面,SSO主要可以分为集中验证模式和多点验证模式。
集中验证模式:当应用系统需要登录时,统一交由验证服务器完成功能登录动作,应用系统不提供登录接入(登录界面)。
相对于多点验证模式来说,集中验证模式的适用范围更广,而且在SSO服务器中使用的是统一的用户名密码,用户无需关注登录的是哪套系统的账号,所以用户体验更加优秀。由于所有的登录都放在了统一的服务器,所以当集中验证服务器宕机时,
所有系统无法正常登录,或丢失SSO的功能,建议以独立服务器作为集中验证服务器,并需要保证登录服务器的稳定性。
多点验证模式:应用系统供各自的登录界面,登录了一套系统后,另外其他系统无需再次登录即可通过身份验证。
在多点验证模式的模式下,所有的登录操作都在应用系统完成,任何一套系统宕机不会对其它系统产生影响,也不会影响正常运行系统间的SSO。但若各套系统的账号不一样的时候,若要用户区分每套系统的用户密码,必定会降低用户的体验,
为了解决该问题,多点登录模式最好有统一的用户密码验证的服务(如LDAP身份验证)。另外,多点登录模式相对集中验证模式来说会存在更多的技术限制。
从SSO技术实现的角度,SSO的实现通常有一下三种技术实现途径:代理登录(agent)、令牌环(token),身份票据(ticket)。
代理登录(agent):代理登录的原理就是在IE端通过表单提交的方式模拟应用系统的登录操作,实现SSO。
代理登录的优点就是无需对原有系统做任何改造,适用于无法改造的旧系统;
其缺点很明显:
1、稳定性差,一旦登录期间某台服务器无法响应,则该服务器无法单点登录。
2、安全性差,用户名密码通过明文传输。
3、由于登录期间需要监控各个系统的响应,所以不建议大量使用,否则会影响登录的性能。
4、由于IE的安全限制,代理登录必须在同域的情况下运行。
令牌环(token):通过Cookie共享令牌环的方式传递当前用户信息,实现SSO。
令牌环的方式最大好处在于无需统一的验证服务器,是“多点验证模式”的主力实现技术,各个服务器都通过统一的密钥对令牌进行加密解密,所以该方式具有安全性高、稳定性好、性能消耗低等优点;其缺点就是必须保证各台应用服务器同域。
身份票据(ticket):与令牌环不一样,身份票据是通过URL的方式传递,通过“两次握手”的方式,实现SSO。(如开源的CAS就是这种原理)
身份票据的方式,是适用范围最广的一种SSO实现方式,可以解决跨域等问题,安全性高、稳定性好;其缺点就是必须增加一台验证服务器,保证在高压下验证服务器的稳定运行,性能方面由于每次登录都需要访问验证服务器,所以比令牌环的方式略差一点。
三种技术实现途径的比较
比较项 |
代理登录 |
令牌环 |
身份票据 |
需求实现程度 |
无法实现同时切换用户与会话同时过期 |
全部 |
全部 |
对原系统改造 |
无 |
小量改造 |
小量改造 |
安全性 |
低 |
高 |
高 |
稳定性 |
偏低 |
好 |
好 |
性能开销 |
登录瞬间压力大一点 |
非常小 |
较小 |
适用范围 |
同域,对用户密码不一致的系统,需在登录服务器的用户凭证库保存用户密码映射 |
同域,对不同登录名需增加对用户凭证库的访问 |
所有可改造的系统,对不同登录名需在登录服务器的用户凭证库保存用户映射 |
独立验证服务器 |
需要 |
不需要 |
需要 |
登录模式支持 |
集中验证模式 |
集中验证模式/多点验证模式 |
集中验证模式 |
本人小白,在对接过程中遇到单点登录问题,查找网上资料记录一下。
token实现思路:
1、用户登录校验,校验成功后就返回Token给客户端。
2、客户端收到数据后保存在客户端。
3、客户端每次访问API是携带Token到服务器端。
4、服务器端采用filter过滤器校验,校验成功则返回请求数据,校验失败则返回错误码
ticket实现思路:
1、访问服务:sso客户端发送请求访问应用程序提供的服务资源。
2、定向认证:sso客户端会重定向用户请求到sso服务器。
3、用户认证:进行用户身份认证。
4、发放票据:sso服务器会产生一个随机的ServiceTicket。
5、验证票据:sso服务器验证票据ServiceTicket的合法性,验证通过后,允许客户端访问服务。
6、传输用户信息:sso服务器验证票据通过后,传输用户认证结果信息给客户端。
详细CAS实现单点登陆原理请参考 http://blog.csdn.net/javaloveiphone/article/details/52439613,我觉得讲的很详细。