Yale's CAS Single Sign On

http://starrynight.blogdriver.com/starrynight/330399.html

 

耶鲁大学开发的单点登录(Single Sign On)系统称为CAS(Central Authentication Service),是一个独立于平台的,易于理解的开源软件,支持代理功能。Spring Framework的Acegi安全系统支持CAS,并提供了易于使用的方案。


CAS的设计目标
       l、为多个Web应用提供单点登录基础设施,同时可以为非Web应用但拥有Web前端的功能服务提供单点登录的功能;
      2、简化应用认证用户身份的流程;
      3、将用户身份认证集中于单一的Web应用,让用户简化他们的密码管理,从而提高安全性;而且,当应用需要修改身份验证的业务逻辑时,不需要到处修改代码;

CAS的设计和实现
       CAS(Central Authentication Server)被设计成一个独立的Web应用。它目前的实现是运行在HTTPS服务器上的几个Java Servlet。通过三个URL来访问:Login URL,Validation URL和可选的Logout URL。下图是CAS的单点登录流程示意图:
 


       为了使用CAS,Web应用重定向它的用户(或简单地创建一个超链接)到Login URL,例如 https://secure.its.yale.edu/cas/servlet/login。用户也可以手工访问这个URL,如果希望预先验证会话。
       Login URL处理初步的认证工作,它提示用户输入NetID和密码,并用Kerberos服务器校验它们是否匹配。为了接下来能自动重新验证用户身份,CAS也会试图给浏览器回送Cookie(浏览器关闭后会自动过期)。这个Cookie用于识别已经成功登录的用户身份。
       使用这个可选的Cookie,CAS可以为用户实现对于多个Web应用单点登录的效果。这就是说,用户只需输入一次他的NetID和密码,即可访问任何使用CAS的资源服务。没有这个Cookie,当Web应用重定向用户到CAS时,用户每次都要输入NetID和密码。(用户也可以通过访问Logout URL,如 https://secure.its.yale.edu/cas/servlet/logout,来要求CAS删除这个Cookie。)
       为了处理初步的身份认证,CAS也记录了用户被重定向时访问的service。可以这样做是因为CAS要求重定向或链接用户到Login URL的Web应用提供一个service的标志符(在上图中记为serviceID)。如果验证成功,CAS创建一个位数很长的随机数(我们称之为ticket)。CAS把这个ticket和成功登录的用户以及用户要访问的service联系起来。例如,如果用户peon重定向自service S,CAS创建ticket T,这个ticket T允许peon访问service S。这个ticket是个一次性的凭证;它仅仅用于peon,仅仅用于service S,并且只能使用一次,使用之后马上会过期。
       一旦完成了初步的身份验证,CAS重定向用户浏览器回到原来的Web应用URL。CAS之所以能记得原来的URL,是因为上面讨论的service ID作为一个"callback URL"。CAS重定向用户的浏览器回到原来的URL,并加上上面讨论的ticket作为请求参数。
       为了让讨论更加清楚,考虑下面的例子。假设用户在访问 http://www.yale.edu/tp之前需要验证身份,我们把用户从 http://www.yale.edu/tp重定向到下面的Login URL:
       https://secure.its.yale.edu/cas/servlet/login?service=http://www.yale.edu/tp/authenticate.jsp
JSP页面authenticate.jsp是网站资源的一部分。一旦完成了上面描述的初步身份验证,CAS用下面的URL重定向用户浏览器到这个JSP页面:
       http://www.yale.edu/tp/authenticate.jsp?ticket=opaque-ticket-string
       一旦收到请求,authenticate.jsp页面需要校验这个收到的ticket,它把tickect传送Validation URL(如 http://secure.its.yale.edu/cas/servlet/validate)。authenticate.jsp页面需要使用JSSE向Validation URL发送请求并读取数据。当生成这个请求时,authenticate.jsp页面还需要把先前的service ID用service的参数名传送给Validation URL,例子如下:
       http://secure.its.yale.edu/cas/servlet/validate?ticket=T&service=S
       当CAS从Validation URL收到这个ticket,它检查自己内部数据库,看看是否保存过这个ticket。如果数据库有这个ticket,则进一步检查数据库中和ticket关联的service是否和刚收到的service相匹配。如果匹配,则向请求验证身份的应用URL返回NetID;否则拒绝验证这个请求。
       Validation URL向请求身份验证的应用URL返回数据的方式很简单。CAS用text/plain的应答方式返回两行数据;第一行是yes或no,取决于ticket验证是否通过。如果ticket通过验证,第二行则是成功通过身份验证的用户的NetID。如果ticket没有通过验证,第二行为空。例子如下:
       yes
       peon
       如果ticket通过验证,CAS立即删除该ticket,使它以后不能再使用。
       当完成了身份验证的循环流程,Web应用无需知道用户的密码即可校验用户身份。此外,如果用户浏览器接受Cookie,它将保留一个可用于多次向CAS验证用户身份的Cookie,让用户以后不用再输入NetID和密码。(目前,这个用于身份验证的Cookie保留8个小时。)

 

- 作者: starrynight 2004年09月17日, 星期五 20:58

你可能感兴趣的:(sign)