1 单点登录的定义
单点登录(Single Sign On),简称为SSO。是目前比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。它是企业应用集成在。身份认证”层面的整合。
2 B/S架构的单点登录原理
本文基于B/S架构来讨论单点登录技术,如图1所示。
当用户第一次访问应用系统1的时候,因为还没有登录,会被引导至认证系统中进行登录(1);根据用户提供的登录信息,认证系统进行身份验证,如果通过验证。应该返回给用户一个认证的票据principal(2):用户再访问别的应用的时候(3,5)就会将这个血k毗带上.作为自己认证的依据,应用系统接受到请求之后会把ticket送到认证系统进行验证,检查principal的合法性(4,6)。如果通过验证。用户就可以在不用再次登录的情况下访问应用系统2和应用系统3了。
图1单点登陆示意图
从图1可以看出,要实现SSO,需要以下主要的功能:
①所有应用系统共享一个身份认证模块。统一认证是SSO的前提之一。认证的主要功能是将用户的登录信息和用户信息库相比较,对用户进行登录认证;认证成功后,认证应该生成统一的认证票据(principal),返还给用户。另外,认证还应该对principal进行验证,判断其有效性。
②所有应用系统能够识别和提取principal信息。要实现SS0的功能,让用户只登录一次,就必须让应用系统能够识别已经登录过的用户。应用系统应该能对principal进行识别和提取,通过与认证模块的通讯,能自动判断当前用户是否登录过,从而完成单点登录的功能。
3 单点登录实现方案
实现单点登录通常有以下几种常见的方案:
3.1 SSO商业软件:如Netgrity的Siteminder。Novell公司的iChain,RSA公司的ClearTrust等,这些商业软件一般适用于客户对SSO的需求很高,并且企业内部采用COTS软件如:Domino,SAP,Sieble的系统比较多的情况下采用。并结合身份管理。统一认证等项且采用。采用这些软件一般都要对要集成的系统做些改造,如在要集成的系统上安装AGENT。
3.2基于COOKIE的方案将认证信息以COOKIE的形式存储在客户端,在同一域中应用系统共享此认证信息。这种方案不能跨域,但可以通过变通的技巧实现跨域。由于要在客户端存储登录信息,并在网络中传输,应对登录信息进行加密。基于COOKIE实现单点登录的关键是同一主域名下的多个应用可以共享COOKIE。假设应用系统A部署在a.domain.corn,B部署在b.domain.com(A和B的主域名都是domain.corn)如果设cookie的时候,设置domain为domain.com,那在A、B上都可以访问到这个cookie了。当A和B的主域名不一致时,A和B不能共享COOKIE,单点登录将失败,本文后续将详细介绍解决方案。
3.3基于令牌(TOKEN)传递的方式以耶鲁大学的CAS项目为基础,由CAS执行授权,用户名和密码不会通过网络在应用系统间传播,增加了安全性。
3.4 USBKey登录每个使用该系统的用户都有一个USBKey证书,这种证书是一个带智能芯片、形状类似于U盘的硬件设备,在登陆系统的时候把这个证书插在计算机上。每一个网站都要通过这个证书去认证。这样每个登录用户只需插上USBKey即可进入受信任系统,当然访问USBKey首先需要密码校验。
4 基于Cookie的解决方案
假设一个场景:一个用户还没有在任何一个系统中登录。他想访问部署到AppServer1上的应用,于是他打开浏览器(Browser),在地址栏中输入一个URL,并按回车,接下来发生的事情,在图2中做了分解。
图2 权限管理系统单点登陆框图
4.1用户首先访问APPServer1的应用,被APPServerl的AasWebFiher过滤嚣拦截,过滤器通过用户的请求对象取得Cookie中的票据信息,它要验证一下用户是否已经登录了。
4.2过滤器请求ClientService远程接口。验证用户的登录状态。
4.3为了验证用户的登录状态。ClientService远程接口请求部署在AASServer上的权限系统中AasSetrice服务,AssService服务提供很多用户认证和授杈方面的服务。AasService服务检查该用户的票据信息,发现该用户的票据信息不存在或已过期,说明该用户没有登录过,于是返回一个未登录的状态给他的服务请求者。
4.4 AasWebFilter收到未登录的状态,首先保存了用户当前的请求地址,然后将用户重定向到登录页面,登录页面由权限系统提供。用户输入登录信息,提交到权限系统。
4.5权限系统的AasWebFiher发现用户请求登录,于是不做权限检查,直接交给Servlet来处理。
4.6 Servlet会请求AasService对用户提交的信息进行认证。
4.7如果用户认证成功,权限系统生成合法的票据返回给浏览器,浏览器将其保存在Cookie中,并重定向到用户登录前请求的页面,AasWebFiher收到这个页面的请求,会再做一遍第二步和第三步流程,确认用户是合法的,于是将请求转交给Servlet处理。
4.8 Servlet委托AppModule处理请求。AppModule相当于Struts Action。
4.9 AppModule泛指应用系统中的功能模块,负责处理用户提交的请求。
4.10由于业务的需要,用户想登录到APPServer2上的应用程序,于是在浏览器中输入APPServer2的地址,浏览器将此前登录后Cookie中的票据信息一并提交到APPServer2。
4.11 AasWebFilter同样委托ClientService验证用户的信息,得知用户曾在其他系统中登录,属于合法用户,于是将请求转发给Servlet处理。
4.12 Servlet调用特定的AppModule处理请求有一个细节,在第十步中,浏览器将AASServer设置的Cookie提交到APPServer2的域上,这是不可能实现的,因为同一Cookie不能在多个域中共享使用,本文在下一小节中将解决Cookie跨域问题。
5 解决Cookie跨域的问题
在上一小节中,本文提出了Cookie跨域问题,为什么会存在这样一个问题呢7因为浏览器都具有隐私策略的设定:不允许跨域共享Cookie。由于Cookie会保存一些用户的敏感信息,如用户名、密码、银行账号等,处于安全与隐私的考虑,通常浏览器只允许本域设置的Cookie本域可以访问,其他域里的应用无法获得这些Cookie,浏览器会根据Cookie的名字判断Cookie所属的域。
举一个例子:现在有两台服务器(两个域)。每台服务器上部署了一个WEB应用,用户访问A服务器上的应用app1时。app1的程序可以设置myCookie=1,同样。用户访问B服务器上的应用app2时,app2的程序也可以设置同名的myCookie=2,那么这时,app1读取到的myCookie的值是什么呢?答案是1。同样,app2读取的myCookie的值是2,这说明,浏览器在向appl提交请求时。只会将appl所设置的Cookie封装到请求中,而不会将其他域设置的Cookie封装进请求。浏览器是分域来保存各个系统设置的Cookie信息的,几乎所有的浏览器都遵循这一事实。
用户登录后的票据信息保存在权限系统所设置(对应图中AASServer)的Cookie中。用户访问其他服务器上的应用时,不会将权限系统设置的票据信息提交,那么系统就无法判断用户是否在其他域中已经登录了(判断是否登录的依据就是,用户在权限系统所在的域中是否设置了票据的Cookie),继而单点登录也就失效了。
为了实现单点登录功能,需要使各个业务系统设置一个包含票据信息的Cookie,使业务系统都拥有本域的票据信息。由于用户总是要通过权限系统登录,因此,可以在权限系统中设置票据信息的Cookie。用户在访问其他业务系统时,首先重定向到权限系统,检查权限系统中是否设置过Cookie,如果设置过Cookie,那么说明用户在权限系统中是登录成功的状态,只要将带有票据信息的请求重定向到业务系统,由业务系统设置所在域的票据Cookie。这样在业务系统的域中也有票据Cookie存在了。
核心关注:拓步ERP系统平台是覆盖了众多的业务领域、行业应用,蕴涵了丰富的ERP管理思想,集成了ERP软件业务管理理念,功能涉及供应链、成本、制造、CRM、HR等众多业务领域的管理,全面涵盖了企业关注ERP管理系统的核心领域,是众多中小企业信息化建设首选的ERP管理软件信赖品牌。
转载请注明出处:拓步ERP资讯网http://www.toberp.com/
本文标题:基于Cookie的单点登录实现