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