文档库 最新最全的文档下载
当前位置:文档库 › SSO单点登录

SSO单点登录

SSO单点登录
SSO单点登录

From: https://www.wendangku.net/doc/f814964688.html,/zhouxing/archive/2011/08/09/102616.html

单点登陆(Single Sign-On,SSO)

1 什么是单点登陆

单点登录(Single Sign On),简称为SSO,是目前比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。

较大的企业内部,一般都有很多的业务支持系统为其提供相应的管理和IT服务。例如财务系统为财务人员提供财务的管理、计算和报表服务;人事系统为人事部门提供全公司人员的维护服务;各种业务系统为公司内部不同的业务提供不同的服务等等。这些系统的目的都是让计算机来进行复杂繁琐的计算工作,来替代人力的手工劳动,提高工作效率和质量。这些不同的系统往往是在不同的时期建设起来的,运行在不同的平台上;也许是由不同厂商开发,使用了各种不同的技术和标准。如果举例说国内一著名的IT公司(名字隐去),内部共有60多个业务系统,这些系统包括两个不同版本的SAP的ERP系统,12个不同类型和版本的数据库系统,8个不同类型和版本的操作系统,以及使用了3种不同的防火墙技术,还有数十种互相不能兼容的协议和标准,你相信吗?不要怀疑,这种情况其实非常普遍。每一个应用系统在运行了数年以后,都会成为不可替换的企业IT架构的一部分,如下图所示。

随着企业的发展,业务系统的数量在不断的增加,老的系统却不能轻易的替换,这会带来很多的开销。其一是管理上的开销,需要维护的系统越来越多。很多系统的数据是相互冗余和重复的,数据的不一致性会给管理工作带来很大的压力。业务和业务之间的相关性也越来越大,例如公司的计费系统和财务系统,财务系统和人事系统之间都不可避免的有着密切的关系。

为了降低管理的消耗,最大限度的重用已有投资的系统,很多企业都在进行着企业应用集成(EAI)。企业应用集成可以在不同层面上进行:例如在数据存储层面上的“数据大集中”,在传输层面上的“通用数据交换平台”,在应用层面上的“业务流程整合”,和用户界面上的“通用企业门户”等等。事实上,还用一个层面上的集成变得越来越重要,那就是“身份认证”的整合,也就是“单点登录”。

通常来说,每个单独的系统都会有自己的安全体系和身份认证系统。整合以前,进入每个系统都需要进行登录,这样的局面不仅给管理上带来了很大的困难,在安全方面也埋下了重大的隐患。下面是一些著名的调查公司显示的统计数据:

?用户每天平均16 分钟花在身份验证任务上- 资料来源:IDS

?频繁的IT 用户平均有21 个密码- 资料来源:NTA Monitor Password Survey

?49% 的人写下了其密码,而67% 的人很少改变它们

?每79 秒出现一起身份被窃事件- 资料来源:National Small Business Travel Assoc

?全球欺骗损失每年约12B - 资料来源:Comm Fraud Control Assoc

?到2007 年,身份管理市场将成倍增长至$4.5B - 资料来源:IDS

使用“单点登录”整合后,只需要登录一次就可以进入多个系统,而不需要重新登录,这不仅仅带来了更好的用户体验,更重要的是降低了安全的风险和管理的消耗。请看下面的统计数据:

?提高IT 效率:对于每1000 个受管用户,每用户可节省$70K

?帮助台呼叫减少至少1/3,对于10K 员工的公司,每年可以节省每用户$75,或者合计$648K

?生产力提高:每个新员工可节省$1K,每个老员工可节省$350 &O5533;资料来源:Giga ?ROI 回报:7.5 到13 个月&O5533;资料来源:Gartner

另外,使用“单点登录”还是SOA时代的需求之一。在面向服务的架构中,服务和服务之间,程序和程序之间的通讯大量存在,服务之间的安全认证是SOA应用的难点之一,应此建立“单点登录”的系统体系能够大大简化SOA的安全问题,提高服务之间的合作效率。

2 单点登陆的技术实现机制

随着SSO技术的流行,SSO的产品也是满天飞扬。所有著名的软件厂商都提供了相应的解决方案。在这里我并不想介绍自己公司(Sun Microsystems)的产品,而是对SSO技术本身进行解析,并且提供自己开发这一类产品的方法和简单演示。

单点登录的机制其实是比较简单的,用一个现实中的例子做比较。颐和园是北京著名的旅游景点,也是我常去的地方。在颐和园内部有许多独立的景点,例如“苏州街”、“佛香阁”和“德和园”,都可以在各个景点门口单独买票。很多游客需要游玩所有德景点,这种买票方式很不方便,需要在每个景点门口排队买票,钱包拿进拿出的,容易丢失,很不安全。于是绝大多数游客选择在大门口买一张通票(也叫套票),就可以玩遍所有的景点而不需要重新再买票。他们只需要在每个景点门口出示一下刚才买的套票就能够被允许进入每个独立的景点。

单点登录的机制也一样,如下图所示,当用户第一次访问应用系统1的时候,因为还没有登录,会被引导到认证系统中进行登录(1);根据用户提供的登录信息,认证系统进行身份效验,如果通过效验,应该返回给用户一个认证的凭据--ticket(2);用户再访问别的应用的时候(3,5)就会将这个ticket带上,作为自己认证的凭据,应用系统接受到请求之后会把ticket送到认证系统进行效验,检查ticket的合法性(4,6)。如果通过效验,用户就可以在不用再次登录的情况下访问应用系统2和应用系统3了。

从上面的视图可以看出,要实现SSO,需要以下主要的功能:

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

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

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

要实现SSO的功能,让用户只登录一次,就必须让应用系统能够识别已经登录过的用户。

应用系统应该能对ticket进行识别和提取,通过与认证系统的通讯,能自动判断当前用户是否登录过,从而完成单点登录的功能。

上面的功能只是一个非常简单的SSO架构,在现实情况下的SSO有着更加复杂的结构。

有两点需要指出的是:

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

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

3 WEB-SSO的实现

随着互联网的高速发展,WEB应用几乎统治了绝大部分的软件应用系统,因此WEB-SSO 是SSO应用当中最为流行。WEB-SSO有其自身的特点和优势,实现起来比较简单易用。

很多商业软件和开源软件都有对WEB-SSO的实现。其中值得一提的是OpenSSO (https://https://www.wendangku.net/doc/f814964688.html,/),为用Java实现WEB-SSO提供架构指南和服务指南,为用户自己来实现WEB-SSO提供了理论的依据和实现的方法。

为什么说WEB-SSO比较容易实现呢?这是有WEB应用自身的特点决定的。

众所周知,Web协议(也就是HTTP)是一个无状态的协议。一个Web应用由很多个Web页面组成,每个页面都有唯一的URL来定义。用户在浏览器的地址栏输入页面的URL,浏览器就会向Web Server去发送请求。如下图,浏览器向Web服务器发送了两个请求,申请了两个页面。这两个页面的请求是分别使用了两个单独的HTTP连接。所谓无状态的协议也就是表现在这里,浏览器和Web服务器会在第一个请求完成以后关闭连接通道,在第二个请求的时候重新建立连接。Web服务器并不区分哪个请求来自哪个客户端,对所有的请求都一视同仁,都是单独的连接。这样的方式大大区别于传统的(Client/Server)C/S结构,在那样的应用中,客户端和服务器端会建立一个长时间的专用的连接通道。正是因为有了无状态的特性,每个连接资源能够很快被其他客户端所重用,一台Web服务器才能够同时服务于成千上万的客户端。

但是我们通常的应用是有状态的。先不用提不同应用之间的SSO,在同一个应用中也需要保存用户的登录身份信息。例如用户在访问页面1的时候进行了登录,但是刚才也提到,客户端的每个请求都是单独的连接,当客户再次访问页面2的时候,如何才能告诉Web服务器,客户刚才已经登录过了呢?浏览器和服务器之间有约定:通过使用cookie技术来维

护应用的状态。Cookie是可以被Web服务器设置的字符串,并且可以保存在浏览器中。

如下图所示,当浏览器访问了页面1时,web服务器设置了一个cookie,并将这个cookie和页面1一起返回给浏览器,浏览器接到cookie之后,就会保存起来,在它访问页面2的时候会把这个cookie也带上,Web服务器接到请求时也能读出cookie的值,根据cookie值的内容就可以判断和恢复一些用户的信息状态。

Web-SSO完全可以利用Cookie结束来完成用户登录信息的保存,将浏览器中的Cookie 和上文中的Ticket结合起来,完成SSO的功能。

为了完成一个简单的SSO的功能,需要两个部分的合作:

1.统一的身份认证服务。

2.修改Web应用,使得每个应用都通过这个统一的认证服务来进行身份效验。

3.1 Web SSO 的样例

根据上面的原理,我用J2EE的技术(JSP和Servlet)完成了一个具有Web-SSO的简单样例。样例包含一个身份认证的服务器和两个简单的Web应用,使得这两个Web应用通过统一的身份认证服务来完成Web-SSO的功能。此样例所有的源代码和二进制代码都可以从网站地址https://www.wendangku.net/doc/f814964688.html,/wangyu/下载。

样例下载、安装部署和运行指南:

Web-SSO的样例是由三个标准Web应用组成,压缩成三个zip文件,从https://www.wendangku.net/doc/f814964688.html,/wangyu//中下载。其中SSOAuth

(https://www.wendangku.net/doc/f814964688.html,/wangyu/)是身份认证服务;SSOWebDemo1

(https://www.wendangku.net/doc/f814964688.html,/wangyu/)和SSOWebDemo2

(https://www.wendangku.net/doc/f814964688.html,/wangyu/)是两个用来演示单点登录的Web应用。这三个Web应用之所以没有打成war包,是因为它们不能直接部署,根据读者的部署环境需要作出小小的修改。样例部署和运行的环境有一定的要求,需要符合Servlet2.3以上标准的J2EE容器才能运行(例如Tomcat5,Sun Application Server 8, Jboss 4等)。另外,身份认证服务需要JDK1.5的运行环境。之所以要用JDK1.5是因为笔者使用了一个线程安全的高性能的Java集合类“ConcurrentMap”,只有在JDK1.5中才有。

?这三个Web应用完全可以单独部署,它们可以分别部署在不同的机器,不同的操作系统和不同的J2EE的产品上,它们完全是标准的和平台无关的应用。但是有一个限制,那两台部署应用(demo1、demo2)的机器的域名需要相同,这在后面的章节中会解释到cookie和domain的关系以及如何制作跨域的WEB-SSO

?解压缩SSOAuth.zip文件,在/WEB-INF/下的web.xml中请修改“domainname”的属性以反映实际的应用部署情况,domainname需要设置为两个单点登录的应用(demo1和demo2)所属的域名。这个domainname和当前SSOAuth服务部署的机器的域名没有关系。我缺省设置的是“https://www.wendangku.net/doc/f814964688.html,”。如果你部署demo1和demo2的机器没有域名,请输入IP地址或主机名(如localhost),但是如果使用IP地址或主机名也就意味着demo1和demo2需要部署到一台机器上了。设置完后,根据你所选择的J2EE容器,可能需要将SSOAuth这个目录压缩打包成war文件。用“jar -cvf SSOAuth.war SSOAuth/”

就可以完成这个功能。

?解压缩SSOWebDemo1和SSOWebDemo2文件,分别在它们/WEB-INF/下找到web.xml文件,请修改其中的几个初始化参数

SSOServiceURL

https://www.wendangku.net/doc/f814964688.html,:8080/SSOAuth/SSOAuth

SSOLoginPage

https://www.wendangku.net/doc/f814964688.html,:8080/SSOAuth/login.jsp

将其中的SSOServiceURL和SSOLoginPage修改成部署SSOAuth应用的机器名、端口号以及根路径(缺省是SSOAuth)以反映实际的部署情况。设置完后,根据你所选择的J2EE容器,可能需要将SSOWebDemo1和SSOWebDemo2这两个目录压缩打包成两个war文件。用“jar -cvf S SOWebDemo1.war SSOWebDemo1/”就可以完成这个功能。

?请输入第一个web应用的测试URL(test.jsp),例如

https://www.wendangku.net/doc/f814964688.html,:8080/ SSOWebDemo1/test.jsp,如果是第一次访问,便会自动跳转到登录界面,如下图

?使用系统自带的三个帐号之一登录(例如,用户名:wangyu,密码:wangyu),便能成功的看到test.jsp的内容:显示当前用户名和欢迎信息。

?请接着在同一个浏览器中输入第二个web应用的测试URL(test.jsp),例如https://www.wendangku.net/doc/f814964688.html,:8080/ SSOWebDemo2/test.jsp。你会发现,不需要再次登录就能看到test.jsp的内容,同样是显示当前用户名和欢迎信息,而且欢迎信息中明确的显示当前的应用名称(demo2)。

3.SSOAuth还能直接效验非login.jsp页面过来的用户名和密码的效验请求。这个功

能是用于非web应用的SSO,这在后面的桌面SSO中会用到。

4.SSOAuth还提供logout服务。

?Web应用中每一个需要安全保护的URL在访问以前,都需要进行安全检查,如果发现没有登录(没有发现认证之后所带的cookie),就重新定向到SSOAuth中的login.jsp进行登录。

?登录成功后,系统会自动给你的浏览器设置cookie,证明你已经登录过了。

?当你再访问这个应用的需要保护的URL的时候,系统还是要进行安全检查的,但是这次系统能够发现相应的cookie。

?有了这个cookie,还不能证明你就一定有权限访问。因为有可能你已经logout,或者cookie已经过期了,或者身份认证服务重起过,这些情况下,你的cookie都可能无效。

应用系统拿到这个cookie,还需要调用身份认证的服务,来判断cookie时候真的有效,以及当前的cookie对应的用户是谁。

?如果cookie效验成功,就允许用户访问当前请求的资源。

以上这些功能,可以用很多方法来实现:

?在每个被访问的资源中(JSP或Servlet)中都加入身份认证的服务,来获得cookie,并且判断当前用户是否登录过。不过这个笨方法没有人会用:-)。

?可以通过一个controller,将所有的功能都写到一个servlet中,然后在URL映射的时候,映射到所有需要保护的URL集合中(例如*.jsp,/security/*等)。这个方法可以使用,不过,它的缺点是不能重用。在每个应用中都要部署一个相同的servlet。

?Filter是比较好的方法。符合Servlet2.3以上的J2EE容器就具有部署filter的功能。

(Filter的使用可以参考JavaWolrd的文章

https://www.wendangku.net/doc/f814964688.html,/javaworld/jw-06-2001/jw-0622-filters.html)Filter是一个具有很好的模块化,可重用的编程API,用在SSO正合适不过。本样例就是使用一个filter来完成以上的功能。

这些安全漏洞在商业的SSO解决方案中都会有所考虑,提供相关的安全措施和保护手段,例如Sun公司的Access Manager,cookie的复杂读和对cookie的保护都做得非常好。

另外在OpneSSO (https://https://www.wendangku.net/doc/f814964688.html,/)的架构指南中也给出了部分安全措施的解决方案。

5 当前方案的功能和性能局限性

除了安全性,当前方案在功能和性能上都需要很多的改进:

?当前所提供的登录认证模式只有一种:用户名和密码,而且为了简单,将用户名和密码放在内存当中。事实上,用户身份信息的来源应该是多种多样的,可以是来自数据库中,LDAP 中,甚至于来自操作系统自身的用户列表。还有很多其他的认证模式都是商务应用不可缺少的,因此SSO的解决方案应该包括各种认证的模式,包括数字证书,Radius,

SafeWord ,MemberShip,SecurID等多种方式。最为灵活的方式应该允许可插入的JAAS框架来扩展身份认证的接口

?我们编写的Filter只能用于J2EE的应用,而对于大量非Java的Web应用,却无法提供SSO服务。

?在将Filter应用到Web应用的时候,需要对容器上的每一个应用都要做相应的修改,重新部署。而更加流行的做法是Agent机制:为每一个应用服务器安装一个agent,就可以将SSO功能应用到这个应用服务器中的所有应用。

?当前的方案不能支持分别位于不同domain的Web应用进行SSO。这是因为浏览器在访问Web服务器的时候,仅仅会带上和当前web服务器具有相同domain名称的那些cookie。要提供跨域的SSO的解决方案有很多其他的方法,在这里就不多说了。Sun的Access Manager就具有跨域的SSO的功能。

?另外,Filter的性能问题也是需要重视的方面。因为Filter会截获每一个符合URL映射规则的请求,获得cookie,验证其有效性。这一系列任务是比较消耗资源的,特别是验证cookie有效性是一个远程的http的调用,来访问SSOAuth的认证服务,有一定的延时。

因此在性能上需要做进一步的提高。例如在本样例中,如果将URL映射从“.jsp”改成“/*”,也就是说filter对所有的请求都起作用,整个应用会变得非常慢。这是因为,页面当中包含了各种静态元素如gif图片,css样式文件,和其他html静态页面,这些页面的访问都要通过filter去验证。而事实上,这些静态元素没有什么安全上的需求,应该在

filter中进行判断,不去效验这些请求,性能会好很多。另外,如果在filter中加上一定的cache,而不需要每一个cookie效验请求都去远端的身份认证服务中执行,性能也能大幅度提高。

另外系统还需要很多其他的服务,如在内存中定时删除无用的cookie映射等等,都是一个严肃的解决方案需要考虑的问题。

6 桌面SSO的实现

从WEB-SSO的概念延伸开,我们可以把SSO的技术拓展到整个桌面的应用,不仅仅局限在浏览器。SSO的概念和原则都没有改变,只需要再做一点点的工作,就可以完成桌面SSO 的应用。

桌面SSO和WEB-SSO一样,关键的技术也在于如何在用户登录过后保存登录的凭据。

在WEB-SSO中,登录的凭据是靠浏览器的cookie机制来完成的;在桌面应用中,可以将登录的凭证保存到任何地方,只要所有SSO的桌面应用都共享这个凭证。

从网站可以下载一个简单的桌面SSO的样例(https://www.wendangku.net/doc/f814964688.html,/wangyu/和全部源码(https://www.wendangku.net/doc/f814964688.html,/wangyu/desktop-sso/desktopsso_src.zip),虽然简单,但是它具有桌面SSO大多数的功能,稍微加以扩充就可以成为自己的解决方案。

6.1桌面样例的部署

1.运行此桌面SSO需要三个前提条件:

a) WEB-SSO的身份认证应用应该正在运行,因为我们在桌面SSO当中需要用到

统一的认证服务

b) 当前桌面需要运行Mozilla或Netscape浏览器,因为我们将ticket保存到

mozilla的cookie文件中

c) 必须在JDK1.4以上运行。(WEB-SSO需要JDK1.5以上)

2.解开desktopsso.zip文件,里面有两个目录bin和lib。

3.bin目录下有一些脚本文件和配置文件,其中config.properties包含了三个需要配

置的参数:

a) SSOServiceURL要指向WebSSO部署的身份认证的URL

b) SSOLoginPage要指向WebSSO部署的身份认证的登录页面URL

c) cookiefilepath要指向当前用户的mozilla所存放cookie的文件

4.在bin目录下还有一个login.conf是用来配置JAAS登录模块,本样例提供了两

个,读者可以任意选择其中一个(也可以都选),再重新运行程序,查看登录认证的变化

5.在bin下的运行脚本可能需要作相应的修改

a) 如果是在unix下,各个jar文件需要用“:”来隔开,而不是“;”

b) java 运行程序需要放置在当前运行的路径下,否则需要加上java的路径全名。

6.2桌面样例的运行

样例程序包含三个简单的Java控制台程序,这三个程序单独运行都需要登录。如果运行第一个命叫“GameSystem”的程序,提示需要输入用户名和密码:

效验成功以后,便会显示当前登录的用户的基本信息等等。

这时候再运行第二个桌面Java应用(mailSystem)的时候,就不需要再登录了,直接就显示出来刚才登录的用户。

第三个应用是logout,运行它之后,用户便退出系统。再访问的时候,又需要重新登录了。请读者再制裁执行完logout之后,重新验证一下前两个应用的SSO:先运行第二个应用,再运行第一个,会看到相同的效果。

我们的样例并没有在这里停步,事实上,本样例不仅能够和在几个Java应用之间SSO,还能和浏览器进行SSO,也就是将浏览器也当成是桌面的一部分。这对一些行业有着不小的吸引力。

这时候再打开Mozilla浏览器,访问以前提到的那两个WEB应用,会发现只要桌面应用如果登录过,Web应用就不用再登录了,而且能显示刚才登录的用户的信息。读者可以在几个桌面和Web应用之间进行登录和logout的试验,看看它们之间的SSO。

6.3桌面样例的源码分析

桌面SSO的样例使用了JAAS(要了解JAAS的详细的信息请参考https://www.wendangku.net/doc/f814964688.html,/products/jaas)。JAAS是对PAM(Pluggable Authentication Module)的Java实现,来完成Java应用可插拔的安全认证模块。使用JAAS作为Java

相关文档