您的位置:首页 > 运维架构 > Apache

CAS协议介绍和在apache使用cas实现单点登录sso

2013-05-04 15:42 766 查看
前话

单点登录问题(sso)的一个通俗理解是指访问同一服务器中的不同应用中的受保护资源,用户只需要一次通过登录验证。SSO的应用场景很多,博主这里就不举例了。CAS是耶鲁大学开发的一个SSO系统,同时Spring Framework的安全框架Acegi也支持CAS,CAS被设计成一个单独的web应用。CAS的设计目标:

1、为多个web应用提供SSO设施,同时可以为非web应用但是拥有web前端功能的服务提供SSO功能;

2、简化应用用户身份认证流程;

3、将用户身份认证集中与单一的web应用,让用户简化他们的密码管理,从而提高安全性,同时在修改认证逻辑时也只需要在一处修改。

CAS协议介绍:

首先贴出一张CAS协议框架图:



对上面的框架进行简单的解析:当浏览器第一次访问某个web server(这个web server通常和CAS Client在一起)的受保护资源的时候,CAS Client会将这个请求重定向到CAS Server,接下来CAS Server就要完成对Web Browser的认证,通常会有一个登录页面出现,验证成功之后,针对发送这个请求的User,CAS Server会产生并保存一个 Service Ticket,并将这个ST返回给CAS Client,CAS Cient再将刚用户发送的访问受保护资源的请求后面加上这个ST并发送给CAS
Server,CAS Server对这个ST进行验证,如果通过就会产生一个session(在上图中没有显示表现出来),这个session是一个xml形式的数据,里面可能包括用户的用户名、ST创建时间,上次活动时间等等信息;不通过则拒绝访问。CAS Client会保存这个session,这样一次登录成功之后,在有效的时间段内就可以利用这个session完成验证(5、6步)而无需重新登录。对于User来说,只会感觉到第一次登录时候需要的3过程,如果成功,其实这次登录之后每次访问受保护资源都会进行5、6步骤,只是对用户透明。下面给出一个比较详细的“浏览器在首次访问某受保护资源的请求序列图”:



上面就是CAS原理的介绍。如果大家还有什么不清楚的地方可以回复问我。谢谢。
关于怎么在工程中运用cas:cas分为server和client两个部分,网上有很多关于在tomcat中配置cas server的例子,大概的流程就是添加tomcat的ssl,扩展认证接口。关于cas client网上也有很多在tomcat下的应用,大家都可以去找。但是,这些不是博主要将的主题。在tomcat下,我们知道可以利用web.xml来配置CAS Filter。但是如果我们没有采用tomcat呢?也许你开发这个web server用的不是J2EE,用的不是spring,没有用到tomcat怎么办?假如你用的是django怎么办?下面博主想要讲一下如何在apache中使用CAS。

在apache中使用CAS Client:

首先,在apache中加载支持cas协议的so模块,这是一个CAS Client;去https://github.com/Jasig/mod_auth_cas(如果你有别的地址也不介意)下载mod_auth_cas。然后编译。基本步骤是./configure;make;make
install。然后在apache的配置文件httpd.conf中添加类似的一行:

LoadModule wsgi_module /usr/lib/apache2/modules/mod_wsgi.so

接下来是对CAS Client的配置:同样,在apache的配置文件里添加下面几行(这里我以我自己的配置为例)。

CASDebug On

CASValidateServer Off

CASCookiePath /var/cache/apache2/mod_auth_cas/

CASLoginURL https://10.15.62.56:8443/cas/login
CASValidateURL https://10.15.62.56:8443/cas/serviceValidate
<Location /Engineering/personal/mystudy/>

Authtype CAS

require valid-user

</Location>

其中:

CASCookiePath /var/cache/apache2/mod_auth_cas/  注意修改这个文件夹的权限。这个里面存储的是cas client完成认证后获得service ticket并利用这个ticket向发送服务请求并听过验证后创建的seesion相关信息,例如:用户名、创建时间、上次活动的时间等,确保这个文件夹只能被web server写,否则别人可能会伪造seesion。可以运行如下命令:sudo chown www-data mod_auth_cas/  sudo chmod 750 mod_auth_cas



CASLoginURL https://10.15.62.56:8443/cas/login 是认证接口,这里填上你的CAS Server对应的URL
CASValidateURL https://10.15.62.56:8443/cas/serviceValidate 是用来验证ticket有效性的接口,同上

/Engineering/personal/mystudy/是我的受保护资源的URL,这个就相当于Filter。

注意,这里我将CASValidateServer设置为了Off,这样mod_auth_cas就没有去验证CAS Server的证书,如果你碰见

This server could not verify that youare authorized to access the documentrequested. Either you supplied the wrongcredentials (e.g., bad password), or yourbrowser doesn't understand how to supplythe credentials required.

的错误,可以尝试这么做。但是这是不安全的(因为我相信我的CAS Server),上面提示的错误如果不是因为你的密码输入错误就应该是跟你们的证书有关。

完成上面的配置之后重启apache服务器,可以在log中查看是否成功,如果想要看关于apache中配置cas client的更多帮助可以参考:

https://github.com/Jasig/mod_auth_cas/blob/master/README

接下来就是在web service中获取用户的信息了,我们知道session里面以xml的形式保存了相关信息,具体有哪些信息也可以在cas server中配置。以django为例可以通过如下语句获得用户名:

user_name = request.META['REMOTE_USER']。

好了,这边博文的重点是介绍cas的原理和在apache中配置cas client。这些都是我自己总结的,肯定有很多不足,甚至有不少错误的地方,大家如果发现了希望能够提出来,如果有什么问题也可以提出来一起讨论一下!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: