概述:


单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一。


SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。


SSO的一种较为通俗的定义是:SSO是指访问同一服务器不同应用中的受保护资源的同一用户,只需要登录一次,即 通过一个应用中的安全验证后,再访问其他应用中的受保护资源时,不再需要重新登录验证。 


为什么需要单点登录:


随着企业的发展,业务系统的数量在不断的增加,老的系统却不能轻易的替换,这会带来很多的开销。其一是管理上的开销,需要维护的系统越来越多。很多系统的 数据是相互冗余和重复的,数据的不一致性会给管理工作带来很大的压力。


企业应用集成(EAI, Enterprise Application Integration)。企业应用集成可以在不同层面上进行:例如在数据存储层面上的“数据大集中”,在传输层面上的“通用数据交换平台”,在应用层面上的“业务流程整合”,和用户界面上的“通用企业门户”等等。事实上,还有一个层面上的集成变得越来越重要,那就是“身份认证”的整合,也就是“单点登录”。


没有单点登录的时候,系统整合是这样:


SSO单点登录架构图 sso单点登录原理_服务器


单点登录的机制:


SSO单点登录架构图 sso单点登录原理_单点登录_02


SSO单点登录架构图 sso单点登录原理_单点登录_03


用户第一次登录系统A时,会被引导到认证系统中进行登录;


根据用户提供的登录信息,认证系统进行身份验证。如果验证成功,会返回给用户一个认证的凭证(ticket);


用户再访问系统B时,会带上这个ticket作为自己认证的凭证。系统B会将这个ticket发送到认证系统中进行验证,检查ticket的合法性;


如果验证通过,用户就不用再次登录,就可以进入系统B了。




简单单点登录应该具备的内容:


所有应用系统共享一个身份认证系统。


统一的认证系统是SSO的前提之一。认证系统的主要功能是将用户的登录信息和用户信息库相比较,对用户进行登录认证;认证成功后,认证系统应该生成统一的认证标志(ticket),返还给用户。另外,认证系统还应该对ticket进行效验,判断其有效性。


所有应用系统能够识别和提取ticket信息。


要实现SSO的功能,让用户只登录一次,就必须让应用系统能够识别已经登录过的用户。应用系统应该能对ticket进行识别和提取,通过与认证系统的通讯,能自动判断当前用户是否登录过,从而完成单点登录的功能。




单点登录需要注意的问题:


单一的用户信息数据库并不是必须的。


有许多系统不能将所有的用户信息都集中存储,应该允许用户信息放置在不同的存储中。事实上,只要统一认证系统,统一ticket的产生和效验,无论用户信息存储在什么地方,都能实现单点登录。


统一的认证系统并不是说只有单个的认证服务器。


整个系统可以存在两个以上的认证服务器,这些服务器甚至可以是不同的产品。认证服务器 之间要通过标准的通讯协议,互相交换认证信息,就能完成更高级别的单点登录。如下图,当用户在访问应用系统1时,由第一个认证服务器进行认证后,得到由此 服务器产生的ticket。当他访问应用系统4的时候,认证服务器2能够识别此ticket是由第一个服务器产生的,通过认证服务器之间标准的通讯协议 (例如SAML)来交换认证信息,仍然能够完成SSO的功能。 




SSO单点登录架构图 sso单点登录原理_单点登录_04


SSO单点登录架构图 sso单点登录原理_sso_05


单点登录的好处:


方便用户


用户使用应用系统时,能够一次登录,多次使用。用户不再需要每次输入用户名称和用户密码,也不需要牢记多套用户名称和用户密码。单点登录平台能够改善用户使用应用系统的体验。


方便管理员


系统管理员只需要维护一套统一的用户账号,方便、简单。相比之下,系统管理员以前需要管理很多套的用户账号。每一个应用系统就有一套用户账号,不仅给管理上带来不方便,而且,也容易出现管理漏洞。


简化应用系统开发


开发新的应用系统时,可以直接使用单点登录平台的用户认证服务,简化开发流程。单点登录平台通过提供统一的认证平台,实现单点登录。因此,应用系统并不需要开发用户认证程序。 




单点登录的分类:


跨子域单点登录


所谓的跨子域单点登录,就是A、B站点和P站点位于同一个域下面。比如:A站点为http://www.baidu.com,B站点为http://tieba.itcast.com,P站点为http://fangi.itcast.com。


完全跨域单点登录


所谓的完全跨域单点登录,就是A、B站点没有共同的父域,但仍然可以共用登录。比如:A站点为http://www.baidu.cn,B站点为http://www.sina.cn。




实现单点登录的方式:


基于cookies实现


需要注意如下几点:如果是基于两个域名之间传递sessionid的方法可能在windows中成立,在 unix&linux中可能会出现问题;可以基于数据库实现;在安全性方面可能会作更多的考虑。另外,关于跨域问题,虽然cookies本身不跨 域,但可以利用它实现跨域的SSO。


Broker-based(基于经纪人)


基于经纪人的SSO系统采用一个集中的认证和用户帐号管理服务器,认证服务器扮演着经纪人的角色。当用户访问应用服务器之前,先向经纪人进行主动的身份认证,然后再携带票据许可到授权服务器获取服务票据,用户携带服务票据去请求应用服务器,最终应用服务器验证服务票据后再提供响应服务。


Agent-based(基于代理)


基于代理的SSO系统中存在一个身份认证的代理程序,用户登录服务器时,代理程序将记录其密码并自行发送给其他集成的系统,代替用户进行登录。




Token-based


现在被广泛使用的口令认证,比如FTP,邮件服务器的登录认证,这是一种简单易用的方式,实现一个口令在多种应用当中使用。


基于网关


网关可以是防火墙,也可以是专门用于通信加密的服务器。需要单点登录的服务器都放置在网关隔离的安全网段内。客户端通过认证后获得服务授权。


基于安全断言标记语言(SAML)实现


SAML(Security Assertion Markup Language,安全断言标记语言)的出现大大简化了SSO,并被OASIS批准为SSO的执行标准。开源组织OpenSAML 实现了 SAML 规范,可参考http://www.opensaml.org。


SSO单点登录架构图 sso单点登录原理_SSO单点登录架构图_06


SSO单点登录架构图 sso单点登录原理_服务器_07

SSO单点登录架构图 sso单点登录原理_单点登陆_08

后续会继续上传demo源码!