0%

CAS的搭建及认证流程分析与比较

CAS 简介

CAS是一个单点登录(Single Sign On,简称SSO,SSO使得在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统)框架,开始是由耶鲁大学的一个组织开发,后来归到apereo去管。

CAS Server搭建

在此下载:https://github.com/apereo/cas/tree/4.1.x
通常来说用mvn编译cas-server-webapp后放到tomcat中就行,但是cas默认需要走https,否则在登陆流程和跳转webapp流程中会出现如下两种报错。
image.png

image.png

第一种解决办法是生成一个自签名的ssl证书并在tomcat的server.xml中配置。

1
keytool -genkey -alias tomcat -keyalg RSA -keystore /path/to/my/keystore
1
2
3
4
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
keystoreFile="${user.home}/.keystore" keystorePass="p@assw0rd"
clientAuth="false" sslProtocol="TLS" />

但是这种方法影响wireshark后续抓包分析,并且默认情况下CAS要求webapp也是https。

第二种办法是修改cas配置使其允许http。有下面四步。

  1. p:httpClient-ref="supportsTrustStoreSslSocketFactoryHttpClient"后增加p:requireSecure="false"image.png

  2. 修改WEB-INF/spring-configuration/ticketGrantingTicketCookieGenerator.xmlimage.png

  1. 修改WEB-INF/spring-configuration/warnCookieGenerator.xmlimage.png
  1. 修改注册服务WEB-INF/classes/services/HTTPSandIMAPS-10000001.json将"serviceId" : "^(https|imaps)://.*"修改为"serviceId" : "^(https|http|imaps)://.*"image.png

修改重启后虽然前端还是会爆错,但是其实正常登陆了。默认的帐密是casuser/Mellon,记录在deployerConfigContext.xml中。
image.png
image.png

image.png

Webapp搭建

在此下载:https://github.com/UniconLabs/cas-sample-java-webapp
修改web.xml中casServerLoginUrl、casServerUrlPrefix、serverName值。casServerLoginUrl对应cas server地址(如果来客没有登陆过webapp就会把来客重定向到这里进行cas统一认证),casServerUrlPrefix对应cas server地址(这个值后续会跟一些api路径做拼接),serverName是webapp地址。
image.png

认证流程分析

环境ip说明
cas server:172.16.247.1
cas webapp:172.16.247.139
用户:172.16.247.131

  • user访问webapp,因为之前从未登陆过webapp,所以webapp会把user重定向给cas进行统一登陆(重定向的url的serivce中带有webapp自己的url好让cas知道user登陆成功后该重定向回哪里)。image.png
  • user在cas登陆,登陆成功后cas会给user带一个cookie(TGC也叫TGT,如果之后要登陆其他webapp就不用重复输入密码而是直接给ST了)和一个ST(在location url中)的302回webapp。image.png
  • webapp拿到user请求过来的ST会向CAS的api发送已验证ST的合法性,如果cas验证成功会发送给CAS的是成功的状态信息和用户的一些数据。image.png
    image.png
  • webapp从cas那里得知ST是有效的,给user设置cookie(用户之后就不必再走一次这个流程了)。并让用户成功登陆。image.png

一图胜千言,图片来自网络(侵删)。

image.png

SSO vs Kerberos vs OAuth

当时看完整个cas的认证流程感觉里面一些要素和kerberos和OAuth认证很相似(都有一个第三方来进行认证/授权)。因此相比较一下这三者的区别。

SSO vs Kerberos

sso和kerberos和共同点在他们都一个用TGT换ST的过程,不同点在于kerberos中其实有四个角色(client,KDC-AS,KDC-TS,server)并且因为“相近”的两个之间预先共享密钥,所以server不需要发送请求向KDC求证ST的真实性,但是CAS中server需要向cas server求证真实性。

SSO vs OAuth

它俩之前最大的不同的在业务场景的不同,SSO用在一个公司内部员工的单点登陆。OAuth用在两个公司之前A公司获取其用户在B公司的一些数据。OAuth还常常涉及到啊AB两公司的帐号绑定,所以需要state来防止csrf,这个是SSO里面没有的。

编译整个cas的遇到org.samba.jcifs:jcifs-ext:0.9.4无法下载的问题,选择手动下载jar并安装到本地maven仓库中。

1
2
#下载地址:http://maven.yonyoucloud.com/nexus/content/groups/public/org/samba/jcifs/jcifs-ext/0.9.4/
mvn install:install-file -DgroupId=org.samba.jcifs -DartifactId=jcifs-ext -Dversion=0.9.4 -Dpackaging=jar -Dfile=/Users/cengsiqi/Downloads/jcifs-ext-0.9.4.jar

参考

cas 4.1.4单点登录实战
CAS 4.1.10关闭HTTPS
使用maven命令安装jar包到本地maven仓库
Spring P标签的使用