網路基礎 CAS協議學習總結

来源:https://www.cnblogs.com/shouke/archive/2023/05/07/17281670.html
-Advertisement-
Play Games

架構介紹 系統組件 CAS伺服器和客戶端構成了CAS系統體繫結構的兩個物理組件,它們通過各種協議進行通信。 CAS伺服器 CAS伺服器是基於Spring Framework構建的Java servlet,其主要職責是通過簽發和驗證ticket來驗證用戶並授予對啟用CAS認證了的服務(通常稱為CAS客 ...


架構介紹

CAS Architecture Diagram

系統組件

CAS伺服器和客戶端構成了CAS系統體繫結構的兩個物理組件,它們通過各種協議進行通信。

CAS伺服器

CAS伺服器是基於Spring Framework構建的Java servlet,其主要職責是通過簽發和驗證ticket來驗證用戶並授予對啟用CAS認證了的服務(通常稱為CAS客戶端)的訪問許可權。當用戶成功登錄(即認證通過)時,CAS伺服器會向用戶簽發TGT(Ticket Granting Ticket),並創建SSO會話。應用戶的請求,通過使用TGT作為令牌的瀏覽器重定向,向啟用CAS認證的服務簽發ST(Service Ticket)。ST隨後通過調用介面在CAS伺服器上進行驗證。這些交互作用在CAS協議文檔中有詳細描述。

CAS客戶端

術語“CAS客戶端”在其常見用法中有兩個不同的含義。CAS客戶端是任何啟用CAS認證的應用,可通過支持的協議與CAS伺服器通信。CAS客戶端也是一個軟體包,可以與各種軟體平臺和應用程式集成,以便通過某些身份驗證協議(例如CAS、SAML、OAuth)與CAS伺服器通信。CAS客戶端支持多種軟體平臺和並且已經開發了很多產品。

CAS協議

CAS協議是一種簡單而強大的基於票證(ticket)的協議。完整的協議規範可以查看這裡

它涉及一個或多個客戶端和一個伺服器。客戶端嵌入在CAS化的(CASified)應用程式中(稱為“CAS服務”),而CAS伺服器則是一個獨立的組件:

  • CAS伺服器負責對用戶進行身份驗證並授予對應用程式的訪問許可權

  • CAS客戶端保護CAS應用程式並從CAS伺服器檢索授權用戶的身份。

關鍵概念:

  • TGT (Ticket Granting Ticket), 存儲在 TGC cookie中,為SSO(Single Sign On, 單點登錄,)會話的Key,代表某個用戶的某個SSO會話。
  • TGC(Ticket Granted Cookie),以TGT為值的Cookie
  • ST (Service Ticket,服務票證), 作為GET URL請求參數傳輸,表示由CAS伺服器授予給特定用戶對CAS服務的訪問許可權。

單點登錄:指在多個應用系統中,只需登錄一次,即可在多個應用系統之間共用登錄。

協議版本

3.0.3

當前的CAS協議版本是“3.0.3”。協議規範說明可參考連接 https://apereo.github.io/cas/6.6.x/protocol/CAS-Protocol-Specification.html,由Apereo CAS服務實現,作為官方參考實現。在CAS協議“2.0”之上增加了最常見的增強功能。在其他功能中,版本“2.0”和“3.0”之間最引人註目的更新是能夠通過新的/p3/serviceValidate端點返回身份驗證/用戶屬性。

2.0

協議規範說明,可參考連接 https://apereo.github.io/cas/6.6.x/protocol/CAS-Protocol-V2-Specification.html

Web流程圖

CAS Web flow diagram

過程詳述

  1. 用戶通過瀏覽器訪問被保護的應用(暫且稱之為 應用服務)

    GET https://app.example.com/
    
  2. 應用服務上的CAS客戶端檢測到用戶需要進行身份認證時,攜應用返回302響應狀態碼,指示瀏覽器重定向到CAS伺服器。

    說明:CAS客戶端包含一個AuthenticationFilter過濾器,該過濾器可以攔截所有的請求,用於判斷用戶是否需要通過Cas Server進行身份認證,如果需要則將跳轉到CAS伺服器登錄頁面,否則則請求會繼續往下執行

    關鍵響應頭

    location: https://cas.example.com/cas/login?service=https%3A%2F%2Fapp.example.com%2F
    

    其中,service指向用戶原訪問地址(註意,是經過URL編碼後的地址)

  3. 瀏覽器根據302響應狀態碼及響應頭location指示,自動重定向訪問CAS伺服器。

    GET https://cas.example.com/cas/login?service=https%3A%2F%2Fapp.example.com%2F
    
  4. CAS伺服器未檢測到SSO會話,向用戶返回CAS登錄表單頁面。

  5. 用戶手動輸入正確用戶名,密碼等認證信息後,提交表單

    POST https://cas.example.com/cas/login?service=https%3A%2F%2Fapp.example.com%2F
    
  6. CAS伺服器接收到用戶名和密碼後,對用戶進行驗證(可使用CAS伺服器預設的驗證,也可以自定義實現驗證方法),如果驗證通過,則創建SSO會話,簽發一個ST(作為location請求中URL參數傳輸) , 返回302響應狀態碼,及location請求頭,提示瀏覽器重定向訪問應用服務。

    關鍵響應頭

    Location: https://app.example.com/?ticket=ST-12345678
    Set-Cookie: CASTGC=TGT-2345678
    

    說明:Set-Cookie響應頭,提示瀏覽器存儲Cookie--將TGT(Ticket Granted Ticket)存儲為CASTGC Cookie值,這是單點登錄的關鍵步驟,因為這樣以後,當前瀏覽器中訪問其它需要CAS認證的應用服務時,將自動攜帶CASTGC Cookie重定向訪問CAS伺服器網站,而訪問CAS伺服器時,CAS服務會通過該Cookie值,即TGT來查找對應的SSO會話,如果存在會話,則表示已登錄CAS伺服器,簽發ST, 返回302響應狀態碼,提示瀏覽器重定向訪問應用服務,否則未登錄,返回CAS伺服器登錄頁。

    註意,CASTGC也可能被命名為其它類似名稱,比如 CASTGC-D,如果有對CAS伺服器進行相關改造的話。

  7. 瀏覽器根據302響應狀態碼及響應頭location指示,自動重定向訪問 應用服務。

    GET https://app.example.com/?ticket=ST-12345678
    
  8. 應用服務收到請求後,請求CAS伺服器服務驗證介面,驗證ST

    註意:每個ST只能用一次,且存在有效期,這就是為啥需要二次訪問CAS伺服器進行驗證的原因。

    GET https://cas.example.com/serviceValidate?service=https%3A%2F%2Fapp.example.com%2F&ticket=ST-12345678
    
  9. CAS伺服器對ST進行驗證,生成XML響應報文,返回給應用服務,該XML響應報文包含是包含是否驗證成功、被認證的用戶信息、可選屬性。

  10. 應用服務收到響應報文後,可根據CAS伺服器驗證結果,為當前用戶生成會話,返回302響應狀態碼,Set-Cookielocation響應頭,提示瀏覽器存儲會話Cookie,並再次通過重定向訪問應用服務。

    關鍵響應頭:

    Set-Cookie: JSESSIONID=ABC1234567
    Location: https://app.example.com/
    

    註意:上述Location中的URL,沒有攜帶ticket參數,避免長時間將ST暴露在瀏覽器地址欄中

  11. 用戶瀏覽器收到響應後,根據提示重定向訪問應用服務

    GET https://app.example.com/
    Cookie: JSESSIONID=ABC1234567
    
  12. 應用服務收到上述請求後,驗證會話Cookie,如果存在對應會話,則表示用戶已登錄,返回用戶請求的資源

  13. 當用戶第二次訪問相同應用服務時,應用服務會再次驗證會話Cookie,如果存在對應會話,則表示用戶已登錄,返回用戶請求的資源

    GET https://app.example.com/resource
    Cookie: JSESSIONID=ABC1234567
    

  14. 用戶通過瀏覽器訪問被保護的另一個應用(暫且稱之為 應用服務2)

    GET https://app2.example.com/
    
  15. 應用服務2上的CAS客戶端檢測到用戶需要進行身份認證時,攜應用返回302響應狀態碼,指示瀏覽器重定向到CAS伺服器。

    關鍵響應頭

    location: https://cas.example.com/cas/login?service=https%3A%2F%2Fapp2.example.com%2F
    
  16. 瀏覽器根據302響應狀態碼及響應頭location指示,攜CASTGC Cookie自動重定向訪問CAS伺服器。

    GET https://cas.example.com/cas/login?service=https%3A%2F%2Fapp2.example.com%2F
    Cookie: CASTGC=TGT-2345678
    
  17. CAS伺服器根據CASTGC檢測是否已存在SSO會話,發現已存在對應會話(即無需CAS登錄),簽發一個ST, 返回302響應狀態碼,及location請求頭,提示瀏覽器重定向訪問應用服務。

    關鍵響應頭

    Location: https://app2.example.com/?ticket=ST-345678
    
  18. 瀏覽器根據302響應狀態碼及響應頭location指示,自動重定向訪問 應用服務2。

    GET https://app2.example.com/?ticket=ST-345678
    

  1. 應用服務2收到請求後,請求CAS伺服器服務驗證介面,驗證ST

    GET https://cas.example.com/serviceValidate?service=https%3A%2F%2Fapp2.example.com%2F&ticket=ST-345678
    
  2. CAS伺服器對ST進行驗證,生成XML響應報文,返回給應用服務,該XML響應報文包含是包含是否驗證成功、被認證的用戶信息、可選屬性。

  3. 應用服務2收到響應報文後,可根據CAS伺服器驗證結果,為當前用戶生成會話,返回302響應狀態碼,Set-Cookielocation響應頭,提示瀏覽器存儲會話Cookie,並再次通過重定向訪問應用服務2。

    關鍵響應頭:

    Set-Cookie: MOD_AUTH_CAS_S=XYZ1234567
    Location: https://app.example.com/
    

    註意:上述Location中的URL,沒有攜帶ticket參數,避免長時間將ST暴露在瀏覽器地址欄中

  4. 用戶瀏覽器收到響應後,根據提示重定向訪問應用服務2

    GET https://app2.example.com/
    Cookie: MOD_AUTH_CAS_S=XYZ1234567
    
  5. 應用服務2收到上述請求後,驗證會話Cookie,如果存在對應會話,則表示用戶已登錄,返回用戶請求的資源

CAS單點登出(SLO,Single Logout )

單點登出(註銷登錄),意味著除了讓CAS伺服器自身SSO會話失效,還將使客戶端應用會話失效,如果CAS客戶端支持註銷協議的話。

只要TGT過期,就會啟動註銷協議。

使用警告!

預設情況下,啟用單點登出。

當CAS會話結束時,它會通知每個應用服務SSO會話不再有效,依賴方需要使自己的會話無效。記住,提交給每個CAS保護應用服務的回調僅是一個通知,沒有別的了。應用程式需要攔截該通知,並通過特定端點手動或更常見的是通過支持SLO的CAS客戶端類庫正確銷毀用戶身份驗證會話。

還要註意,由於SLO是一個全局事件,因此預設情況下,將聯繫具有CAS身份驗證記錄的所有應用程式,如果這些應用程式彼此不同,則可能會對用戶體驗造成負面影響。例如,如果用戶已登錄門戶應用程式和電子郵件應用程式,則通過SLO註銷其中一個應用程式也會破壞另一個的用戶會話,如果應用程式沒有仔細管理其會話和用戶活動,這可能意味著數據丟失。

流程如下:

image-20230325094331695

通過訪問CAS伺服器logout API(如下),可以註銷CAS登錄。

https://cas.example.com/cas/logout

image-20230325101830282

如果希望註銷登錄後,跳轉到應用服務登錄頁,需要添加service參數,並設置跳轉目標URL,如下:

https://wcas.sit.sf-express.com/cas/logout?service=https%3A%2F%2Fcas.example.com%2Fcas%2Flogin%3F

參考連接

https://apereo.github.io/cas/6.6.x/planning/Architecture.html

https://apereo.github.io/cas/6.6.x/protocol/CAS-Protocol.html

https://apereo.github.io/cas/6.6.x/protocol/CAS-Protocol-Specification.html

https://cloud.tencent.com/developer/article/2141095

https://apereo.github.io/cas/6.6.x/installation/Logout-Single-Signout.html

作者:授客
微信/QQ:1033553122
全國軟體測試QQ交流群:7156436

Git地址:https://gitee.com/ishouke
友情提示:限於時間倉促,文中可能存在錯誤,歡迎指正、評論!
作者五行缺錢,如果覺得文章對您有幫助,請掃描下邊的二維碼打賞作者,金額隨意,您的支持將是我繼續創作的源動力,打賞後如有任何疑問,請聯繫我!!!
           微信打賞                        支付寶打賞                  全國軟體測試交流QQ群  
              


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前言 早就聽聞大名鼎鼎的GeoTools,因為自己不搞Java,所以之前沒用過, 背景 最近有個需求,一個白模系統,具體是數據是用SDE導入到postgresql中,然後用arcgis server發佈了矢量,最後用 arcgis api for js 4.x拉伸,得到有高度的白模。以前的數據都是通 ...
  • 資料庫系統概論—基礎篇(3) 三.資料庫安全性 1.資料庫安全性概述 資料庫的安全性指保護資料庫以防不合法使用所造成的數據泄露、更改或破壞 2.資料庫安全性控制 2.1用戶身份鑒別 靜態口令鑒別 動態口令鑒別 生物鑒別特征 智能卡鑒別 2.2存取控制 自主存取控制:給用戶限權(DAC,C1級) 強制 ...
  • > 近日來對Kotlin的使用頻率越來越高, 也對自己近年來寫過的Kotlin代碼嘗試進行一個簡單的整理. 翻到了自己五年前第一次使用Kotlin來完成的一個項目([貝塞爾曲線](https://juejin.cn/post/6844903556173004807)), 一時興起, 又用發展到現在的 ...
  • AutoGPT 是什麼 Auto-GPT 是一個實驗性開源應用程式,展示了 GPT-4 語言模型的功能。該程式由 GPT-4 驅動,將 LLM 的“思想”鏈接在一起,以自主實現您設定的任何目標。作為 GPT-4 完全自主運行的首批示例之一,Auto-GPT 突破了 AI 的可能性界限。 AutoGP ...
  • 家人們,這圖片到底怎樣才能完全填滿div啊,想問度娘結果搜索的問題都亂七八糟的 (怎麼那麼多問題QAQ),描述問題都描述不來 具體問題如下:圖片有自己的解析度大小,例如寬100px,高100px,將圖片添加到div中: <div class="xx"> <img src="xxx"> </div> ...
  • 大佬們呀,花了好幾天的時間總算是看著頁面展示可以了,求賜教! 小米商城主頁,對大佬來說肯定簡單爆了,我抄寫了好久呀,總是有一點點的小問題,還搞不明白 主要是一個靜態的小米商城頁面,HTML前端代碼不複雜,一堆的div和ul、li就沒問題了,主要是css代碼搞不懂導致顯示不正常 話不多說,直接上代碼: ...
  • 前端開發中涉及表單的頁面非常多,看似功能簡單,開發快速,實則占去了很大一部分時間。當某個表單包含元素過多時還會導致html代碼過多,vue文件過大。從而不容易查找、修改和維護。為了提高開發效率及降低維護成本,下麵介紹表單配置化組件的封裝原理與封裝方法。 ...
  • 環境:CentOS 7.6_x64 FreeSWITCH版本 :1.10.9 Python版本:3.9.12 一、背景描述 PCM(Pulse Code Modulation,脈衝編碼調製)音頻數據是未經壓縮的音頻採樣數據,它是由模擬信號經過採樣、量化、編碼轉換成的標準數字音頻數據。 在FreeSW ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...