[sso] 單點登陸認證流程

1、流程說明html

第一步:訪問cas過濾連接ssoLogin,拼湊定向到 CAS_SERVER 獲取ticket的URL

第二步:CAS_SERVER校驗用戶信息,生成Ticket

第三步:從新定向到訪問客戶端的ssoLogin並附加Ticket參數和值

第四步:根據傳來的Ticket拼湊定向到CAS_SERVER的鏈接去校驗Ticket的合法性

第五步:CAS_SERVER校驗成功後,會返回XML報文並從新定向到訪問客戶端的ssoLogin
    解析該XML報文,構造用戶信息對象存儲在session中
    而後根據ssoLogin設置的loginSuccessUrl跳轉到登陸成功後的訪問頁面

 

2、具體步驟 java

 

一、導入所需依賴jar包web

 

 

二、在web.xml中配置須要單點登陸過濾的路徑爲/ssoLogin服務器

本地客戶端URL:http://localhost:8080/webtest/ssoLogin

遠程cas服務器地址CAS_LOGIN_URL:https://192.168.6.100/ptyhzx-sso/login

web.xml配置session

 

ssoclient.properties配置ui

 

三、流程剖析編碼

(1) 訪問ssoLogin[處理類:SSOServlet]帶上用戶名和密碼 - requestUrl加密

https://localhost:8080/webtest/ssoLogin?username=user1&password=123456

 

(2) 構造第一次訪問CAS_SERVER的getTicketURLspa

getTicketURL = CAS_LOGIN_URL ? SERVICE參數.net

目的:獲取TICKET

http://192.168.6.100/ptyhzx-sso/login?service=http%3A%2F%2Flocalhost%3A8080%2Fwebtest%2FssoLogin%3Frenew=true&other=form&accessToken=C45BD9AE005909FE2F9EC45D54FF70D2ADD106142B17461AEC94AD4A098A7420025D7694680916B5276CDDE8FA085C5A
說明:

後臺根據 requestUrl 構造 service 參數 service的值 = 去掉用戶名密碼後的requestUrl參數 + renew參數 + other參數 + 用戶名密碼加密後的accessToken 拼接完畢後再對service總體編碼做爲最終的service值

構造獲取getTicektURL完畢後馬上重定向到該URL去

 

(3) CAS_SERVER根據accessToken驗證用戶信息

 

驗證成功

一、生成TOKEN【示例:ST-5649-Wv3HsI75tG7dNzEu9Uxg-cas01.example.org】

二、重定向到requestURL,此時requestURL中包含了ticket參數

http://localhost:8080/webtest/ssoLogin;jsessionid=DBFC81A7ECA2C24C90B2AB5440475E05&ticket=ST-5649-Wv3HsI75tG7dNzEu9Uxg-cas01.example.org

 

驗證失敗,跳轉到配置的loginFailureURL並提示具體錯誤信息

 

(4) 根據獲得的ticket調用驗證方法:

Assertion vaildAssertion = ticketValidator.validate(ticket,requestURL);

 

調用validate方法會構造驗證的 validURL 去CAS服務器驗證這個TICKET是否合法

validateURL =

CAS_SERVER_URL/serviceValidate? + ticket參數 + serviceCode參數 + service參數

service參數是驗證成功後重定向的URL地址

http://192.168.6.100/ptyhzx-sso/serviceValidate?ticket=ST-5653-dURt1ErNHUuEm9j3vsqe-cas01.example.org&serverCode=101&service=http%3A%2F%2Flocalhost%3A8080%2Fwebtest%2FssoLogin

String serverResponse = retrieveResponseFromServer(new URL(validationUrl), ticket); 

 

(6)驗證成功後cas_server會返回xml報文到重定向的URL地址

<!-- 成功時 -->
<cas:serviceResponse xmlns:cas='http://www.yale.edu/tp/cas'>
    <cas:authenticationSuccess>
        <cas:user>a1</cas:user>
        <cas:attributes>
                <cas:id>1100000000000000000</cas:id>
            
                <cas:sex>1</cas:sex>
            
                <cas:username></cas:username>
            
                <cas:authenticationMethod>com.jeaw.sso.adaptors.jdbc.QueryDatabaseAuthenticationHandler</cas:authenticationMethod>
            
                <cas:email></cas:email>
            
                <cas:nickname>a1</cas:nickname>
            
                <cas:status>1</cas:status>
            
                <cas:cellphone></cas:cellphone>
            
                <cas:usertype>03</cas:usertype>
            
                <cas:loginid>1000000001</cas:loginid>
            
                <cas:password>111111</cas:password>
            
        </cas:attributes>
    </cas:authenticationSuccess>
</cas:serviceResponse>


<!-- 失敗時 -->
<cas:serviceResponse xmlns:cas='http://www.yale.edu/tp/cas'>
    <cas:authenticationFailure code='INVALID_TICKET'>
        未可以識別出目標 &#039;ST-136-Tnw7BLEKurYGcDaZFgo6-cas01.example.org&#039;票根
    </cas:authenticationFailure>
</cas:serviceResponse>

 

(7) 後續操做

一、調用parseResponseFromServer(serverResponse)解析該報文以生成 Assertion 對象 
  vaildAssertion 二、構造用戶信息對象存於session   request.getSession().setAttribute("userInfo",vaildAssertion); 三、跳轉到登錄成功頁面   response.sendRedirect(loginSuccessUrl);

 

(8) 交互流程一覽

 

(9)參考文檔

單點登陸SSO的實現原理

CAS實現SSO單點登陸原理

類 Cas20ServiceTicketValidator

基於CAS實現單點登陸(SSO):登陸成功後,cas client如何返回更多用戶信息

相關文章
相關標籤/搜索