单点登录解决方案
背景    1
CAS简介    1
基于CAS的单点登录解决方案    5
一.CAS单点登录环境的搭建    5
二.CAS与UniEAP的集成    7
三.在配置CAS和使用CAS可能出现的问题    11
背景
随着互联网络应用的普及,越来越多的人开始使用互联网上提供的服务。然而目前提供服务的网站大多采用用户名、口令的方式来识别用户身份,这使得用户需要经常性的输入自己的用户名、口令。显然这种认证方式存在着弊端:随着用户网络身份的增多,用户相应的需要
记忆多组用户名、口令,这给用户造成记忆上的负担;另外频繁的输入用户名、口令,会相应的增大用户的口令密码被破解的机率。为了改变这一现状,单点登录技术应运而生。单点登录技术的核心思想是通过一定的方式使得各提供服务的网站之间建立某种联系,用户只需要在其中一个认证网站进行登录后,即可实现全局登录,当用户再访问其他网站时,不需要再次登录,其身份就可以被验证。我们可以看到采用单点登录技术后,用户只需要记忆一组用户名、口令,并且在登录多个网站时只需要输入一次用户名、口令,这就使得用户可以更加安全快捷的使用互联网上的各种服务。
UniEAP在支持行业事业部时,发现“单点登录”的需求还是非常多的,因此提供了一个以CAS为基础的单点登录解决方案。
CAS简介
CAS(Central Authentication Service),是耶鲁大学开发的单点登录系统(SSO,single sign-on),应用广泛,具有独立于平台的,易于理解,支持代理功能。CAS系统在各个大学如耶鲁大学、加州大学、剑桥大学、香港科技大学等得到应用。
Spring Framework的Acegi安全系统支持CAS,并提供了易于使用的方案。Acegi安全系统,是一个用于Spring Framework的安全框架,能够和目前流行的Web容器无缝集成。它使用了Spring的方式提供了安全和认证安全服务,包括使用Bean Context,和面向接口的编程方式。因此,Acegi安全系统能够轻松地适用于复杂的安全需求。Acegi安全系统在国内外得到了广泛的应用,有着良好的社区环境。UniEAP中的安全框架是对Acegi Security for Spring框架的集成,因此,也方便集成CAS系统。
CAS设计目标
(1)为多个Web应用提供单点登录基础设施,同时可以为非Web应用但拥有Web前端的功能服务提供单点登录的功能;
(2)简化应用认证用户身份的流程;
(3)将用户身份认证集中于单一的Web应用,让用户简化他们的密码管理,从而提高安全性;而且,当应用需要修改身份验证的业务逻辑时,不需要到处修改代码。
CAS工作原理
CAS(Central Authentication Server)被设计成一个独立的Web应用。实现原理非常简单,CAS Server2.0.12的实现只有30个类,除了JDK本身外,只使用到一个servlet.jar包。它目前的实现是运行在HTTPS服务器的几个Java Servlet上(而客户端可以灵活采用http和https的方式)。通过以下三个URL来访问:Login URL,Validation URL和可选的Logout URL。
参考:www.yale.edu/tp/auth/
CAS的工作过程:
注意,以上是CAS的普通工作模式,在第三步由CAS返回的是一个ticket,并没有任何用户名和密码等信息出现。
这里说的单点登录,CAS中需要存在用户系统,在CAS2.0中,用户需要实现CAS中的PasswordHandler接口,而在CAS3.0中,已支持了多种认证方式,用户需要实现一个AuthenticationHandler接口,该接口有两个方法authenticate()及supports()。
实现AuthenticationHandler接口的类只需在CAS服务器中的配置文件l中配置即可,CAS是基于Spring作的实现。
CAS 类图
第一次通过CAS2.0.12认证的序列图如下图所示:
服务器与代理之间的通信下图。
第一步,用户访问Web App1,向Web App1发送请求,这个请求被单点登录代理拦截。
第二步,单点登录代理将用户的请求重定向到单点登录服务器的登录界面
第三步,用户在登录界面上,输入用户名和密码,进行登录。
第四步,单点登录服务器到后台用户数据库验证用户输入的用户名和密码是否合法。本文设计的单点登录系统并没强制使用数据库验证,用户可以根据需求选用其他的验证方式。
第五步,如果验证成功,服务器将创建这个用户会话用来访问目标应用的服务凭票。然后创建Cookie凭票和相应的Cookie(用来标识用户会话是否经过验证),产生的Cookie会被放到客户端浏览器。
第六步,服务器再将附加了凭票的请求重定向到单点登录代理。web端登录
第七步,单点登录代理接收到带有凭票的请求,然后去服务器验证这个凭票的合法性。验证这个凭票是合法的后,代理不会再拦截这个用户会话,用户请求直接到达目标应用。
第八步,目标应用将欢迎界面返回给用户端的浏览器。
同一个用户会话又访问了另一个也部署的单点应用的Web App2,服务器与代理之间的通信过程见下图。
第一步,用户访问Web App2,向Web App2发送请求,这个请求被单点登录代理拦截。
第二步,单点登录代理将用户的请求重定向到单点登录服务器。
第三步,服务器验证用户请求,从客户端浏览器器得到Cookie,经过和Cookie缓存中比较,发现这个用户已经登录,由于Web App1和Web App2都部署了单点登录,所以说这两个应用是互相信任的,即用户只要登录了Web App1,再登录Web App2就不需要再输入用户名和密码进行验证,所以服务器就不再需要到后台数据库验证。
第四步,服务器将创建这个用户会话用来访问目标应用的服务凭票。
第五步,服务器再将附加了凭票的请求重定向到单点登录代理。
第六步,单点登录代理接收到带有凭票的请求,然后去服务器验证这个凭票的合法性。
第七步,目标应用将欢迎界面返回给用户端的浏览器。
基于CAS的单点登录解决方案
一.CAS单点登录环境的搭建
1.下载CAS server,版本为cas-server-2.0.12
2.下载CAS java client,版本为cas-client-2.0.11
3.部署CAS server,将cas-server-2.0.12.zip解压,并将lib/cas.war拷贝到Server1的webapps下。Server1是一个servlet2.3兼容的服务器上,并且服务器需要支持SSL,我们选用tomcat5.0.28
4.在Server1所运行的jvm里,产生Server1的证书
命令:keytool  -genkey -alias my-alias-name  -keyalg  RSA  -keystore  keystore-file
注意:测试时在名字中输入Server1的IP地址或机器名(cas server和cas client 在同一台机器可使用localhost )
5)在Server1配置tomcat使用HTTPS,$CATALINA_HOME/l里加入以下的配置:
<Connector className="at5.CoyoteConnector"
port="8443" minProcessors="5" maxProcessors="75"
enableLookups="true" disableUploadTimeout="true"
acceptCount="100" debug="0" scheme="https" secure="true">
<Factory className="at5.CoyoteServerSocketFactory" keystoreFile="/path/to/your/keystore-file "  keystorePass=" your-password " clientAuth="false" protocol="TLS" />
  </Connector>
6)导出Server1的证书,用来给所有需要用到的客户端导入,可使用:
命令:keytool -export - -alias my-alias-name -keystore keystore-file
7)在要使用CAS的客户端Client1里设置,测试可以使用ServletFilter(CAS client里提供的)来实现SSO的检查。Client1可使用tomcat5.0.28。配置CAS Client应用中的/l如下:
注意蓝笔画的地方。
192.168.210.80:8443/cas/login
192.168.210.80:8443/cas/proxyValidate是服务器端的
192.168.210.123:8080是客户端的
<filter>
    <filter-name>CAS Filter</filter-name>
    <filter-class>edu.yale.its.tp.cas.client.filter.CASFilter</filter-class>
    <init-param>
      <param-name>edu.yale.its.tp.cas.client.filter.loginUrl</param-name>
      <param-value> 192.168.210.80:8443/cas/login
</param-value>
    </init-param>
    <init-param>
<param-name>edu.yale.its.tp.cas.client.filter.validateUrl</param-name>
<param-value>192.168.210.80:8443/cas/serviceValidate</param-value>
    </init-param>
    <init-param>
  <param-name>edu.yale.its.tp.cas.client.filter.serverName</param-name>
      <param-value>192.168.210.123:8080 </param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>CAS Filter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。