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服務器的日期/時間