CAS介绍
CAS(Central Authentication Service)是Yale大学的发起的一个开源项目,旨在为web应用系统提供一种可靠的单点登录系统,CAS在2004年12月正式成为JA-SIG的一个项目。
CAS具有以下的特点:
开源的、多协议的sso解决方案,Protocols:Custom Protocol、CAS、OAuth、Open ID、RESTful API、SAML1.1、SAML2.0等;
支持多种认证机制:Active Directory、JAAS、JDBC、LDAP、X.509 Certificates等;
安全策略:使用票据(Ticket)来实现支持的认证协议;
支持授权:可以决定哪些服务可以请求和验证服务票据(Service Ticket);
提供高可用性,通过把认证过的状态数据存储在TicketRegistry组件中,这些组件有很多支持分布式环境的实现,如:BerkleyDB、Default、EhcacheTicketRegistry、JDBCTicketRegistry、JBOSS TreeCache、JpaTicketRegistry、MemcacheTicketRegistry等;
适应多种客户端:java、.Net、PHP、Perl、Apache、uPortal等。
CAS原理和协议
从结构上看,CAS包含两部分:CAS Server和CAS Client。
CAS Server 需要独立部署,主要负责对用户的认证工作;
CAS Client 与受保护的客户端应用部署在一起,以Filter方式保护受保护的资源,负责对客户端受保护资源的访问请求,需要对请求方进行身份认证时,重定向到CAS Server进行认证。
图1为CAS基本协议过程:
![CAS 单点登录 - 紫梦潆晴 - 紫梦潆晴的博客](http://img2.ph.126.net/OpUiBgADGr_-II6e2d5efA==/666532744867851176.jpg)
图1
解析:CAS Client与受保护的客户端应用部署在一起,以Filter方式保护Web应用的受保护资源,过滤从客户端过来的每一个Web请求,同时,CAS Client会分析http请求中是否包含请求Service Ticket,如果没有,则说明该用户是没有经过认证的;于是CAS Client会重定向用户请求道CAS Server,并传递Service。step 3是用户认证过程,如果登录成功,CAS Server随机产生一个相当长度、唯一、不可伪造的Service Ticket,并缓存以待将来验证,并且重定向用户到Service所在地址,并为客户端浏览器设置一个Ticket Granted Cookie(TGC);CAS Client在拿到Service和新产生的Ticket过后,在step 5和step 6中与CAS Server进行身份核实,以确保Service Ticket的合法性。
在该协议中,所有与CAS Server的交互均采用SSL协议,以确保ST和TGC的安全性。协议工作过程中会有2次重定向的过程,但是CAS Client与CAS Server之间进行Ticket验证的过程对于用户是透明的。
准备工作
到CAS官网下载CAS Server和Client,地址分别为:
将cas-server-2.0.12.zip解压,并将lib/cas.war拷贝到tomcat的webapps下,测试CAS服务器是否发布正常,可以访问http://localhost:8080/cas/login出现登录窗口。输入用户名密码(用户名=密码),出现登录成功页面说明发布正常
使用java自带的keytool命令,产生Server的证书:
D:\>keytool -genkey -alias my-alias-name keyalg RSA -keystore keystore-file
命令运行后,根据提示回答问题。注意:“你的名字”或“DName” 必须填写你服务器所在的域名(局域网中测试时,使用主机名或hosts文件中注册的域名,本机可以使用localhost)。
配置tomcat使用https协议:
在tomcat_path\conf\server.xml文件中配置SSL的地方,增加如下配置:
<Connector className="org.apache.coyote.tomcat6.CoyoteConnector" port="8443" minProcessors="5" maxProcessors="75" enableLookups="true" disableUploadTimeout="true" acceptCount="100" debug="0" scheme="https" secure="true">
<Factory className="org.apache.coyote.tomcat6.CoyoteServerSocketFactory" keystoreFile="D:/keystore-file" keystorePass="password" clientAuth="false" protocol="TLS"/>
</Connector>
注意:password为证书中输入的密码