单点登录原理和实现
什么是单点登录
单点登录SSO(Single Sign On),是目前常用的企业业务整合的解决方案之一。简单的说,就是在一个存在多个系统的环境下,用户在一处登录之后,就不用在其他系统中再次进行登录,登录一次,就可以取得该环境下其他所有系统的信任。
为什么要用单点登录
在较大的公司内部,一般都有很多的业务支持系统为其提供相应的管理和IT服 务,这些不同的系统往往是在不同的时期建设起来 的,运行在不同的平台上;也许是由不同厂商开发,使用了各种不同的技术和标准。
随 着企业的发展,业务系统的数量在不断的增加,老的系统却不能轻易的替换,这会带来很多的开销。其一是管理上的开销,需要维护的系统越来越多。
很多系统的数 据是相互冗余和重复的,数据的不一致性会给管理工作带来很大的压力。
业务和业务之间的相关性也越来越大,例如公司的计费系统和财务系统,财务系统和人事系 统之间都不可避免的有着密切的关系。
为了降低管理的消耗,最大限度的重用已有投资的系统,很多企业都在进行着企业应用集成(EAI)。
企业应用集成可以在不同层面上进行:
例如:
- 在数据存储层面上的“数据大集中”,
- 在传输层面上的“通用数据交换平台”,
- 在应用层面上的“业务流程整合”,
- 和用 户界面上的“通用企业门户”等等。
事实上,还用一个层面上的集成变得越来越重要,那就是“身份认证”的整合,也就是“单点登录”。
单点登录的运行机制
一个简单的运行机制
某公园中有许多独立的景点,游客可以在每个景点门口进行买票进入。对于需要游玩的游客来说,这种方式很不舒服,在每个景点都需要排队购票,不仅时间繁琐,钱包频繁的掏进掏出,很不安全。
于是很多游客在公园买了一张通票(套票),这样在进入景点时只需要出示一下这张票就可以进入而不需要重复购买景点门票。
单点登录的机制也是这样的。
当用户登录应用系统1的时候,因为这个时候用户还没有登录,所以被引入到认证系统进行登录操作(1)。
当用户登录成功后,认证系统返回给用户一个认证凭证—ticket(2)。
当用户在去访问其他应用系统时(3, 5),会将这个认证凭证ticket带上,作为自己认证的凭据,应用系统接受到请求之后会把ticket送到认证系统进行效验,检查ticket的合法性(4,6).
如果通过效验,用户就可以在不用再次登录的情况下访问应用系统2和应用系统3了。
稍微复杂的运行机制
从上面的视图我们可以看出要实现SSO,需要有以下功能:
- 统一的认证系统。所有应用系统共享一个认证系统,认证系统的主要功能是将用户的登录信息和用户信息库进行比对,对用户进行登录认证,并将登录成功产生的凭证ticket返回给用户。
- 认证系统能够对用户带的ticket校检,判断其有效性。并且所有的应用系统需要能够识别和提取ticket信息。
- 应用系统能够对ticket进行识别和校检,通过和认证系统的通讯,自动判断当前用户是否登录,从而完成单点登录功能。
这里需要注意的是:
单一的用户信息数据库并不是必须的,实际上,只要统一认证系统,统一ticket的产生和校检,无论用户信息存放在哪里都能实现单点登录。
统一的认证系统并不意味着只有单个认证服务器,认证服务器之间要通过标准的通讯协议,互相交换认证信息,就能完成更高级别的单点登录。
单点登录实现原理
sso需要一个独立的认证中心,只有认证中心能接受用户的用户名密码等安全信息,其他系统不提供登录入口,只接受认证中心的间接授权。间接授权通过令牌实现,sso认证中心验证用户的用户名密码没问题,创建授权令牌,在接下来的跳转过程中,授权令牌作为参数发送给各个子系统,子系统拿到令牌,即得到了授权,可以借此创建局部会话,局部会话登录方式与单系统的登录方式相同。这个过程,也就是单点登录的原理,用下图说明:
对上图的描述:
用户没有登录时
- 用户访问系统1的保护资源时,系统1检测到用户还没有进行登录,将会将请求跳转至认证中心系统,认证中心检测用户确实没有登录,那么跳转至登录页面。
- 用户在登录页面提交自己的认证信息给认证中心,认证中心校检用户的信息,如果用户信息正确,将会创建与该用户的全局会话(如果全局会话过期,那么用户将要重新登录,在全局会话中可能将生成的令牌,用户个人信息,登录情况等信息存储在全局会话中)。
- 认证中心将带着创建的令牌跳转回最初的请求地址(系统1),系统1获得令牌后会去认证中心校检该令牌是否有效,如果有效,则进行下一步。
- 系统1使用该令牌创建与用户的会话,称为局部会话,返回受保护资源(如果局部会话过期,系统1会请求认证中心,认证中心发现该用户已经登录,执行步骤3)
用户已登录情况下
- 用户访问系统2,系统二发现该用户没有登录,跳转至认证中心,并将自己的地址作为参数。
- 认证中心发现该用户已经登录,跳转回系统2的地址,并附带上令牌,系统2拿到令牌后去认证中心校检该令牌是否有效。认证中心返回该令牌有效,注册系统2,系统2使用该令牌创建局部会话,返回受保护资源。
用户登录成功之后,会与认证中心及各个子系统建立会话,用户与认证中心建立的会话称为全局会话,用户与各个子系统建立的会话称为局部会话,局部会话建立之后,用户访问子系统受保护资源将不再通过认证中心,全局会话与局部会话有如下约束关系:
- 局部会话存在,全局会话一定存在
- 全局会话存在,局部会话不一定存在
- 全局会话销毁,局部会话必须销毁
令牌设计可以参考:基于跨域单点登录令牌的设计与实现
单点登录中用户认证策略
1. 基于访问票据的认证策略
也就是我们上面一直说的ticket。其核心思想是在认证服务器和应用系统之间建立信任关系,主要采用访问票据(简称Ticket)模型维持这种信任关系。用户成功登录统一认证服务器后,便获得一个ticket凭证,该凭证是用户访问服务器所辖所有应用系统的通行证。目前比较流行的SSO解决方案如Kerberos、Liberty Alliance、Microsoft Passport都是基于访问票据的认证策略。
2. 基于Web请求代理的认证策略
基本思想是通过统一的门户服务器来代理用户的Web请求,门户服务器统一处理用户的身份认证。基于此策略,当用户访问应用系统时,所有的Web请求首先被定向到门户服务器,门户服务器完成用户身份认证,然后把Web请求转向应用系统,并附加上用户身份信息。网页过滤器技术是Web请求重定向主要实现方式。
与基于访问票据的认证思想类似,基于Web请求代理的认证策略也必须建立门户服务器与应用系统之间的信任关系。但基于Web请求代理的认证策略实现机制简洁,结构灵活,对原有Web应用的改造较少。
3. 基于密码代理的认证策略
门户服务器并不控制应用系统的用户认证,只是保管应用系统的用户账户信息,即代理保管用户在应用系统中的用户名和密码,用户在门户服务器通过认证之后,进入应用系统时,门户服务器自动完成应用系统登录。这种策略不用改变原有应用系统,适合于基于界面的集成方式,其实现机制更加灵活简易,成本更低。
单点注销
在一个子系统中注销,那么所有子系统的的会话都会被销毁。
用户向系统1提出注销请求,系统1根据用户与系统1建立的会话id从会话中拿到令牌,向认证中心发起注销请求。
认证中心校检该令牌有效,然后销毁全局会话,同时取出此令牌注册的系统地址。认证中心向所有注册系统发出注销请求,各系统收到注销请求后销毁局部会话,认证中心引导用户跳转值登录页面。