CAS客户端认证流程
CAS登陆流程
Step 1:浏览器向CAS客户端发起登陆请求,CAS客户端生成“登陆URL”,并把浏览器重定向到该URL
登陆URL: https://${cas-server-host}:${cas-server-port}/cas-server/login?service=${client-service-url}
其中
cas-server-host: cas认证服务器的域名
cas-server-port: cas认证服务器的IP
client-service-url: 用于登陆成功后,浏览器重定向的URL
Step 2: 浏览器向“登陆URL”发起重定向请求,CAS服务端创建会话,把TGT(Ticket Granting Ticket)放入cookie,并返回登陆页面
Step 3:用户输入用户名和密码,然后提交登陆表单. CAS服务端通过登陆验证后,会生成一个ST(service ticket,简称ticket), 然后把浏览器重定向到${client-service-url}?ticket=${service-ticket}
Step 4:浏览器重定向到${client-service-url}?ticket=${service-ticket}发起重定向请求
Step 5: CAS客户端取出ticket,生成“ticket验证URL”,然后向"ticket验证URL"发起http GET请求
“ticket验证URL”: http://${cas-server-host}:${cas-server-port}/cas-server/serviceValidate?ticket=${service-ticket}&service=${client-service-url}
Step 6: 如果CAS服务器通过ticket的有效性检查,那么会返回类似如下格式的XML片段
1 |
< cas:serviceResponse xmlns:cas = 'http://www.yale.edu/tp/cas' > |
2 |
< cas:authenticationSuccess > |
3 |
< cas:user >AAAA</ cas:user > |
4 |
</ cas:authenticationSuccess > |
5 |
</ cas:serviceResponse > |
其中AAAA是登陆的用户名
否则返回:
1 |
< cas:serviceResponse xmlns:cas = 'http://www.yale.edu/tp/cas' > |
2 |
< cas:authenticationFailure code = 'XXX' > |
3 |
YYY |
4 |
</ cas:authenticationFailure > |
5 |
</ cas:serviceResponse > |
其中:
- XXX的可能取值是INVALID_TICKET, CREATION_ERROR, INVALID_SERVICE
- YYY是错误描述信息
至此CAS的登陆流程结束
登陆成功后,CAS客户端应该在会话中保存登陆状态信息。CAS服务器通常在Step 6会建立ticket和${client-service-url}的映射关系,以便在登出时通知其业务系统清除缓存中的状态信息
CAS登出流程
浏览器或CAS客户端向“登出URL”发起GET请求:
“登出URL”: https://${cas-server-host}:${cas-server-port}/cas-server/logout
CAS服务器销毁TGT和ST,并向所有已登陆的业务系统发出登出通知请求
请求方法:POST
请求URL: ${client-service-url}
请求头: Content-Type:application/x-www-form-urlencoded
请求正文:
1 |
logoutRequest=< samlp:LogoutRequest xmlns:samlp = "urn:oasis:names:tc:SAML:2.0:protocol" ID = "#LR_TICKET_ID#" |
2 |
Version = "2.0" IssueInstant = "#CURRENT_DATETIME#" > |
3 |
< saml:NameID xmlns:saml = "urn:oasis:names:tc:SAML:2.0:assertion" >@NOT_USED@</ saml:NameID > |
4 |
< samlp:SessionIndex >#ST#</ samlp:SessionIndex > |
5 |
</ samlp:LogoutRequest > |
*其中
- LR_TICKET_ID: CAS服务器为每个登出通知请求所生成的一个值
- ST 之前登陆成功后CAS服务端传回来的Service Ticket
- CURRENT_DATETIME 发出该请求时,CAS服务器的日期/时间