您的位置:

CAS单点登录实现原理详解

一、CAS单点登录

CAS(Central Authentication Service)是一款开源的,支持单点登录(Single Sign-On,SSO)协议的认证系统。它提供了一个中央认证服务器,用户只需要登录一次,就可以在所有的CAS客户端应用中获取登录信息,实现单点登录的功能。

二、CAS单点登录原理解析

CAS单点登录的原理主要包括:认证原理,ST的生成和校验,以及TGT的生成和校验。

1. 认证原理

首先,客户端访问服务器需要登录时,会将请求重定向到CAS服务器,CAS服务器将跳转到登录页面,接收用户输入的用户名和密码,和登录成功后想要访问的客户端应用地址。

之后CAS服务器将根据用户提供的用户名和密码进行认证,认证成功后生成TGT(Ticket-Granting Ticket,门票颁发凭证),然后将TGT的ID放在浏览器cookie中,并将TGT返回给客户端。

2. ST的生成和校验

客户端重定向回原来的客户端应用,在请求参数中添加TGT的ID,客户端应用服务端将TGT的ID和CAS服务器进行验证,验证通过后,CAS服务器生成一个ST(Service Ticket,服务票据),将ST以请求参数的形式返回给客户端应用。

之后客户端应用以ST为参数对CAS服务器进行请求,CAS服务器根据ST进行校验,校验通过后进行客户端应用服务的认证,认证通过后返回认证结果,并在客户端应用的cookie中添加ST。

3. TGT的生成和校验

当客户端应用再次访问其他服务时,会携带之前获取的ST进行访问,服务端从cookie中获取ST,将ST和CAS服务器进行校验,校验通过后返回认证结果。

为了提高系统性能,在每个TGT中,会包含许多ST的ID,这些ST通常与同一服务相关联,如果ST过期了,则可以在TGT的有效期内重新获取新的ST,无需输入用户名和密码。TGT会在用户退出登录或者超时,以及一些其他情况下失效。

三、CAS单点登录系统

CAS单点登录系统通常由CAS服务器、客户端应用和身份认证源组成。CAS服务器用于进行用户的身份认证以及维护TGT和ST,客户端应用用于接收ST并对CAS服务器进行校验,而身份认证源则包括LDAP、数据库、自定义等,用于验证用户提供的用户名和密码是否正确。

四、CAS单点登录原理

CAS单点登录原理主要依赖于Session和Cookie来实现,CAS服务器将用户的登录数据存储在Session中,以便客户端应用的使用。当用户打开一个需要登录的客户端应用时,客户端应用会先检查本地是否存在ST(Service Ticket),如果存在则直接进入,如果不存在则重定向到CAS服务器进行登录认证。

五、CAS实现单点登录原理

CAS实现单点登录可分为以下几个部分:

1. 配置CAS服务器

首先需要下载和配置CAS服务器,包括配置认证源(例如LDAP、数据库等)、配置服务端口号、配置ST和TGT等相关参数。

2. 集成客户端应用

配置客户端应用,将CAS客户端引入到应用中并配置相关参数,包括CAS服务器地址、客户端应用地址、TGCookie的名称、STCookie的名称等。

3. 验证身份认证源

利用身份认证源对用户提供的用户名和密码进行验证,如果验证通过则CAS服务器生成TGT并在浏览器中写入TGCookie,在TGT有效期内,用户可以访问其他需要登录的应用。如果验证不通过则返回登录页面。

六、CAS单点登录缺点

CAS单点登录虽然能够实现在多个应用之间进行登录验证,但其仍存在以下几个缺点:

1. 配置复杂

由于CAS单点登录涉及到多个应用之间的验证,因此其配置比较复杂,需要对CAS服务器和每个客户端应用进行详细的配置。

2. 安全性问题

CAS单点登录在ST和TGT的传输过程中存在被劫持攻击的风险,如果攻击者获取ST,就可以冒充合法用户访问应用。因此,在实现CAS单点登录的过程中,需要加强数据传输时的安全性。

3. 依赖于CAS服务器

由于CAS单点登录的原理依赖于CAS服务器,因此,如果CAS服务器出现故障,会影响所有的客户端应用的正常使用。

七、完整代码示例

# CAS服务器端配置
cas.server.name=https://cas.example.com
cas.server.prefix=https://cas.example.com/cas

cas.service.name=http://localhost:8080/myapp
cas.ticket.st.timeout=30s
cas.ticket.tgt.timeout=10m

#客户端应用配置
cas.server.name=https://cas.example.com
cas.server.prefix=https://cas.example.com/cas
cas.client.serviceUrl=http://localhost:8080/myapp
cas.client.useSession=true
cas.client.redirectUrl=http://localhost:8080/myapp/myappIndex

# 登录认证源配置
cas.authn.ldap[0].type=AUTHENTICATED
cas.authn.ldap[0].ldapUrl=ldap://localhost:389
cas.authn.ldap[0].baseDn=ou=people,dc=example,dc=com
cas.authn.ldap[0].userFilter=uid=%u
cas.authn.ldap[0].bindDn=cn=admin,dc=example,dc=com
cas.authn.ldap[0].bindCredential=secret