目 录
0.
文档介绍
0.1
文档目的
记录使用 CAS 实现 SSO 的过程。
0.2
文档范围
使用 CAS 实现 SSO 的过程 。
0.3
读者对象
任何有兴趣的家伙。
0.4
参考文献
提示: 列出本文档的所有参考文献(可以是非正式出版物),格式如下:
[ 标识符] 作者,文献名称,出版单位(或归属单位),日期
大部分都是网络上查询的资料,很多,不列举了。
0.5
术语与缩写解释
|
缩写、术语 |
解 释 |
|
SSO |
即 Single sign on/off ,单点登录 / 退出 |
|
CAS |
全称 JA-SIG Central Authentication Service ,实现 SSO 的开源项目 |
|
|
|
|
|
|
|
… |
|
1.
概述
1.1
背景
单点登录是必须的,实现方式颇多,这里就说使用 CAS 的实现方式。使用 CAS 实现 SSO ,网络上说明很多,大部分都是从制作证书开始,而实际上是可以不使用 HTTPS 验证,这样更方便。
单点登录的原理是通过拦截 你设定的 URL ,并跳转到 你指定的 CAS SERVER 登录页,当你登录成功后,带着 TICKET ,返回到 你打开的 URL 。然后你就可以一票在手,畅通无阻。
网上有个家伙用旅游的套票来解释单点登录,非常形象。当你到达一个旅游区门口,你可以买一个套票,套票规定你可以游览 N 个景点,进入这些景点的时候,你不需要再买票,也就实现了单点登录。
同时,也可以借用这个比喻说明一下单点注销。当你打开一个应用 A 时,单击了注销按钮,跳转到 http://hostname:port/cas/logout 或者 https://hostname:port/cas/logout ,系统显示注销成功。此时, IE 窗口没有关闭,你继续打开应用 A ,仍然没有注销成功,不需要登录。这就相当于你已经在旅游景点内,即使你把套票撕毁了,你仍然可以继续参观这个景点,不会把你驱逐出去。但是,你再也进不了其它的景点了。
那么怎么实现立即生效的注销呢?或者这种方式是否就满足我们的需求呢?
1.2
环境
Windows XP 、 JDK1.6.03 、 Tomcat6.0.20
注意:配置好环境变量。
1.3
下载资源
服务器端: http://www.ja-sig.org/downloads/cas
当前最新版本是 3.3.4 ,测试安装的版本为 3.3.3
客户端: https://www.ja-sig.org/svn/cas-clients/
cas-client-2.0.11.zip JAVA 支持单点登录
cas-client-3.1.8-release.zip JAVA 支持单点注销
dotnet-client DOTNET 支持类
phpcas PHP 支持
注意:同时要下载源代码,部分功能需要修改源代码,重新做包。
2.
配置
CAS SERVER
CAS SERVER 目录介绍。
2.1
简单配置
把你下载 cas-server 解压,进入 cas-server-3.3\modules ,复制 cas-server-webapp-3.3.war 到 tomcat\webapps 下,修改名称为 cas.war ,方便使用,原来的名字太长了。然后启动 IE ,输入 http://localhost:8080/cas 检验是否可以访问,如果可以,则输入相同的用户名和密码,比如 cas/cas ,测试是否能登录。
如果你对安全性要求不高且急不可待,这个时候就可以直接进行 CAS CLIENT 的配置。
2.2
数据库验证配置
简单配置后,可以使用相同的用户名和密码,进行登录。这个不实际,可以通过配置实现连接自己的数据库进行配置。这里有个前提,就是所有系统需要使用相同的用户表和密码加密方法,可以使用 CAS 自带的加密方法( \org\jasig\cas\authentication\handler\ DefaultPasswordEncoder.class )或自己用 JAVA 写的加密方法。
进入目录 tomcat\webapps\cas\WEB-INF ,打开文件 deployerConfigContext.xml ,找到类似下面的代码:
注意 : cas-server 根据版本不同 , 文件的路径或 BEAN 位置可能不同 , 逐个文件夹找下。
这是默认的方法。同时还有两种可选,如下:
/************************************************************************/
abstract="false" lazy-init="default" autowire="default" dependency-check="default">
以上两种方式都经过测试。另外,也可以写出自己的方法验证,修改
BEAN
的
CLASS
属性即可。如果没有密码没有加密,则可以把参数
下面针对最下面的方法进行说明。
看它的属性,还需要定义两个 BEAN ,数据源和加密,如下:
-->
2.4HTTPS
验证配置
证书的制作使用 keytool 工具,进入 CMD ,输入 keytool ,回车测试,如果出现帮助,则说明环境变量配置正确,如果没有,则配置 PATH ,加入 %JAVA_HOME%\BIN 。
下面开始制作,先找好存放证书的位置:
(1) keytool -genkey -alias tomcatcas -keystore tomcatcas -keyalg RSA -validity 3666
这一步是制作密钥库。
注意:名字与姓氏要输入主机名或域名或 localhost ,不能随意输入。密码为自己设定。下面的密码直接回车。
( 2 ) keytool -export -alias tomcatcas -keystore tomcatcas -file tomcatcas.crt
这一步是把密钥库导出为证书文件。
注意:密码为上一步设定的密码。
( 3 ) keytool -import -alias tomcatcas -file tomcatcas.crt
-keystore %JAVA_HOME%/jre/lib/security/cacerts
这一步是把证书导入 TOMCAT 。
后面的路径为 TOMCAT 使用的 JRE 路径, JDK1.6 安装有两个目录 JDK1.6 和 JRE1.6 , TOMCAT6.0 只要 JRE1.6 即可,通常在安装时,也都是默认到 JRE1.6 ,这时要输入 %JRE_HOME%\lib\security\cacerts ,这个地方必须要确认准确。
注意:这里需要输入密码,此密码不是前面设定的密码,是系统默认的密码 changeit
( 4 )配置 tomcat6.0\conf\server.xml
下面两个为验证地址,即 cas server 的地址,如果使用 https 验证,地址为 https://hostname:8443 字样 - ->
本工程的 URL ,被拦截的地址 - ->
3 、在页面获得验证返回的用户
用户可以通过以下方式,从 JSP 或 servlet 中获取通过认证的用户名:
String username = (String)session.getAttribute(edu.yale.its.tp.cas.client.filter.CASFilter.CAS_FILTER_USER);
获得更完整的受认证用户信息对象 CASReceipt Java Bean ,可以使用以下语句:
CASReceipt receipt = (CASReceipt )session.getAttribute(edu.yale.its.tp.cas.client.filter.CASFilter.CAS_FILTER_RECEIPT);
完成以上后,进行测试。出现错误时,请查看 tomcat\logs 文件解决。
3.2HTTP
验证
1 、修改 casclient.jar 中文件,如图:
2 、重新做 jar 包,复制到工程目录
完成后,做好测试。登录成功后的样子,如下图:
4.
配置
DOTNET CLIENT
1 、把 DotNetCasClient.cs 复制到 DotNet 项目
2 、新建 loginPage.aspx , Page_Load 加入代码
DotNetCASClient.DotNetCASClientServiceValidate client = new DotNetCASClient.DotNetCASClientServiceValidate();
String userId = client.Authenticate(Request, Response, false);
if (userId.Equals("failed"))
{
//Handle the auth failure...
}
else
{
Session[DotNetCASClient.SessionHandle.getUserSession()] = userId;
FormsAuthentication.RedirectFromLoginPage(userId, false);
}
注意: FormsAuthentication.RedirectFromLoginPage 这个方法。
3 、在 Default.aspx 的 Page_Load 内加入获得用户的代码:
4 、修改 web.config 文件
完成后,运行测试,效果如下图:
Cas 为用户名。
5.
配置
PHP CLIENT
6.
如何实现单点注销