① 談談單點登錄
寒假學習的小課題,把之前的筆記整理整理記錄一下(長文警告)因為當時看到的東西涉及很多,所以有一些地方沒有深入去探討。
網路:單點登錄(Single Sign On),簡稱為 SSO,是目前比較流行的企業業務整合的解決方案之一。SSO的定義是在多個應用系統中,用戶只需要登錄一次就可以訪問所有相互信任的應用系統。
簡而言之就是用戶在多個相互信任的應用系統中,只需要登錄一次,就可以訪問其他相互信任的應用系統。這里的關鍵是一次登錄,以及一次退出,都對所有的系統生效。
在普通的登錄中,比如典型的B/S情景,瀏覽器訪問伺服器,發送登錄請求,在發送完用戶名和密碼之後,伺服器會生成該用戶的session來標准該用戶的狀態,比如已登錄還是已注銷,並給一個cookie給瀏覽器,因此,用戶繼續訪問就會帶上這個cookies,服務端會根據這個Cookie找到對應的session,通過session來判斷這個用戶的登錄狀態。比如php中使用phpsessid。當然也可以自定義session的生命周期,session的生命周期過長的話一旦session被盜用就會出現用戶被竊取的情況。同時,生命周期過長的session配置會佔用較多的伺服器資源。
單點登錄主要針對同平台下多應用,多系統的情景下多次登錄的一種解決方案。單點登錄相當於將多個應用的認證體系聯通。
假設現在一個平台上有3個都帶有登錄功能的應用,由上面的普通登錄的情況可以想到,這3台伺服器都會自己的記錄session。那麼要想達到單點登錄,一個最簡單的方法就出現了:共享session。
共享session的方式來實現單點登錄是最方便也是最直接的。在三個子系統中,使用同一個額外的記錄session的伺服器,比如我們可以使用一個redis伺服器來存儲三個系統的session。
用戶登錄了應用1,獲取了應用1返回的cookies,再次訪問應用1的其他功能的候攜帶了cookie就是已登錄的狀態了,但是這樣又有新的問題,雖然實現了共享session,但是用戶登錄了應用1,獲取了應用1返回的cookie,但是因為cookie是無法跨域的,因此用戶無法使用應用1的cookie去訪問應用2。這里我們就需要將系統的全局cookie domain的屬性設置為頂級域名,比如應用1的域名是1.test.com,應用2的域名是2.test.com。在普通登錄的情況下,應用1的cookie domain的屬性是1.test.com,指這個cookie只能在該子域名上被使用。我們將系統的全局cookie domain設置為頂級域名,即.test.com,這樣就可以實現用戶登錄了應用1,之後可以以已登錄狀態訪問應用2和3。
上面的共享session的情況是三個應用都有登錄功能,還有一種類似的情況是應用1和應用2都有登錄模塊和其他模塊,還有一個單獨的SSO系統,是僅有登錄模塊的:
共享session的方法雖然簡單,但是存在局限性,因為使用了cookie頂域的特性,所以不能做到跨域。一個公司或者一個平台很可能不是所有的域名都在在一個一級域名之下的,所以同域名下的單點登錄並不是完整的單點登錄。
先說說openid,openid是一種認證標准,規定如何認證的標准!即其關注的是登錄時身份的認證。官方給出的一個場景,其中一方是一個openid身份伺服器,用來存放注冊好的openid賬號,另一方是受這個openid身份伺服器信賴的服務或應用。openid協議就是提供openid身份伺服器和被信賴的服務或應用之間的通信的。比如我們在很多網站上可以使用QQ登錄,這里的騰訊的QQ就是openid的身份伺服器,我們所要登錄的網站就是受信賴的服務或應用。
在使用openid實現單點登錄的方法有很多,可以使用上面共享session的方法,即把openid帶在cookie裡面,但是這樣也會出現一樣的cookie跨域的問題。
在實際場景中,我們在訪問提供服務的應用時檢測到未登錄就會直接跳轉到openid身份伺服器,或者沒有重定向而是在登錄表單附近點擊選擇使用第三方openid登錄,進行賬號密碼登錄(這可以保證我們所登錄的伺服器無法獲取我們的敏感身份認證信息),具體流程如下:
CAS全稱為Central Authentication Service即中央認證服務,是一個企業多語言單點登錄的解決方案,並努力去成為一個身份驗證和授權需求的綜合平台。CAS就是一個現成的單點登錄的demo,企業只需要簡單修改就可使用。
CAS支持各種協議,SAML,OAuth,OpenID,OIDC等等,支持LDAP,Radius,JWTX,509等等進行身份認證和授權,還有各種常用語言的客戶端,Java,PHP,C# 等等。反正就是一個十分完整的,兼容性特別好的SSO框架。
簡單了解CAS是如何實現單點登錄的。在官網上可以看到其給出的一個 流程圖 ,。這個圖說的特別詳細,一下就能看懂,直接原圖上進行標注查看:
學習了上面幾種單點登錄的知識,結合實際場景可知,跨域單點登錄才是真正的單點登錄,因為實際情況下很多平台或者域名不可能都在一個一級域名下。在解決跨域單點登錄的問題的時候,上面也給說了幾種方式,但是究其根本,就是利用一個SSO認證中心來實現認證與授權的。當然,也會有其他的解決跨域單點登錄的方案,但是大體流程都與cas類似。
比如在上圖的11步驟,也可使用POST包,或者JSONP和iframe方法來跨域發送請求進行重定向。
在利用認證中心來實現單點登錄是現在比較普遍的解決方案,那麼有沒有不需要使用認證中心來解決跨域單點登錄的方案呢?
利用JSONP同步登錄狀態,大概流程流程如下:
在學習單點登錄的過程中,在其中認證的過程中授權令牌的傳遞等相關信息沒有特別詳細的說明,而且在思考單點登錄的時候也會有想過一個比較矛盾的問題:單點登錄的目標是為了讓用戶可以在相互信任的系統中一次登錄即可,但是如果真的是做到所有用戶都可以訪問所有系統,豈不是會帶來越權的問題,是否需要對不同的用戶以不同的授權,甚至限制訪問的應用,但是這樣是不是就不是原本狹義的單點認證?
在說單點登錄的認證和授權之前,先談一談我一直想弄清楚的統一身份認證和單點登錄的區別。說起單點登錄可能很少聽過,但是統一身份認證肯定不陌生,不管是企業還是高校都會有這種統一身份認證的系統。
統一身份認證最重要的一方面就是身份認證,另一方面就是和身份認證相關的授權控制,許可權控制。而單點登錄是多應用一次登錄,也可以叫統一登錄,可以理解為主要在認證方面。對於統一身份認證來說會有賬號管理,如LDAP,認證管理OAuth,SMAL等,因此我覺得,統一身份認證一般是包括狹義的單點登錄,狹義的單點登錄,即只需要滿足多應用一次登錄即可。但是現在的單點登錄,SSO系統並不僅僅是要求這些,他的范圍正在慢慢擴大。
單點登錄的認證和授權,前面說到的CAS實現單點登錄里就會看到需要ticket來進行認證,授權。CAS支持多種認證方案,比如OAuth,OpenID,SAML等等,我們可以來比較比較用這些協議的區別,或者說是在哪些場景下使用哪些認證方案較為合適。本身單點登錄是沒有許可權控制的功能的,但是因為這些認證協議的需求,自然支持了許可權控制。
在使用SAML進行認證的過程中,可以看到下圖,其是基本流程都差不多,這里需要注意的就是在用戶在認證中心成功登陸之後,重定向的時候返回的是一個SAML token,一個XML節點,這里的token會包括用戶的身份信息,用戶名等。
在OAuth2.0的標准中流程是和上面的基本相同,但是OAuth2因為客戶端並沒有一點是瀏覽器,所以token中默認是沒有簽名的。這里可能沒有體現出來,OAuth2的目標是授權,所以token更關注的是許可權,token在向認證伺服器驗證的時候就會有不同的授權,但是既然是授權,就間接實現了認證。
在傳統的認證中都是基於session機制的,具體的session模式上面也說了,根據其特性可知session的一些確定:
https://www.mutuallyhuman.com/blog/choosing-an-sso-strategy-saml-vs-oauth2/
https://yq.aliyun.com/articles/636281
https://juejin.im/post/5d0dbb7e6fb9a07f0420512d
② (急)如何用ASP.net語言配置單點登錄cas-Client客戶端
你指的是要做成單點登錄需要進行哪些程序的限制嗎?如果是的話,要考慮一下幾個方面的問題。
在資料庫中設立一張表,相當於用戶登錄表,如果用戶登錄了,就在該表中記錄該用戶登錄的時間和IP地址,並將狀態更改為登錄。
其它地方再次通過該用戶登錄的時候判斷該用戶是否已經登錄,如果登錄,向登錄端發送消息,告訴它您的賬號在其它地方登錄,同時增加新的用戶登錄信息。(這個是允許用戶在其它地方登錄的情況,如果其它地方登錄,那麼強制讓本地登錄的用戶下線。)
如果不讓其它地方登錄,那麼就告訴他該用戶已經登錄,您不能再登錄。但是這個有個問題要注意,如果本地用戶是被強制退出(例如斷電),沒有來及更改用戶狀態,那麼這個用戶可能一直處於登錄狀態。應該還有個服務程序定期的遍歷用戶,判斷哪些用戶已經下線。
③ CAS4.2單點登錄如何配置多個系統登錄一次和退出到登錄頁問題
問題1:hhaip-cas1.com、hhaip-cas2.com和hhaip-secure.com的IP分別是什麼?如果都是127.0.0.1,那埠號得錯開,不能全部8080;如果不一樣,那從這個配置文件看不出問題,只能後台瞧一下日誌,看訪問app2的時候ServiceTicket為什麼沒有生產,TGT為什麼被銷毀
問題2:使用HTTP就別指望本地能正常退出了,換HTTPS吧
④ 我用CAS做單點登錄出來的錯誤,哪個幫忙解決一下
1、把虛擬內存(頁面文件)轉移到安裝XP以外的其他分區D或E……。方法是:右擊我的電腦—屬性—高級—性能設置—高級—虛擬內存更改—點選C盤—單選「無分頁文件(N)」—「設置」,此時C盤中的虛擬內存就消失了;然後選中D盤,單選「自定義大小」—在下面的「初始大小」和「最大值」兩個文本框中輸入數值—「設置」—確定—重啟,便完成了設置。
2、關閉休眠。單擊「開始」--「控制面板」--「電源管理」--「休眠」,將「啟用休眠」前的勾去掉。
3、關閉系統還原。單擊「開始」--「所有程序」--「附件」--「系統工具」—「系統還原」,在系統還原界面,勾選「在所有驅動器上關閉系統工程還原」-確定。
⑤ 360極速瀏覽器使用cas單點登錄慢解決辦法
360極速瀏覽器使用cas單點解決辦法:
1、打開360極速瀏覽器,點擊瀏覽器右上方「自定義和控制360極速瀏覽器」圖標,在下方的菜單中點擊打開「選項」頁面。
2、進入選項頁面後看向左側的菜單欄中,點擊「高級設置」這一項切換到對應的設置頁面。
3、在右側的高級設置內容中可以看到「隱私設置」這一項,點擊右側的「清除上網痕跡」按鈕。
4、在彈出的「清除上網痕跡」窗口中將「清除這段時間的數據」修改為全部,然後勾選「清除緩存」這一項,其它的選項則可以選擇性的勾選,然後點「清除」按鈕就可以將緩存清除了。
⑥ 使用cas單點登錄之後相關問題怎麼解決
安全證書是tomcat或者apache用於開啟ssl安全的socket鏈接使用的,也就是支持https協議的。一般我們都用tomcat作為應用伺服器,這樣就需要tomcat首先支持https協議,開啟https很簡單,找一下官方的文檔資料,我在這里簡單說一下,首先在部署tomcat的機器上為jdk(確切的說是jre,不過通常我們都在tomcat的伺服器上安裝jdk而不是jre)生成證書,使用jre自帶的keytool工具來生成即可,生成證書的過程中注意一點,就是CN項,也就是第一個欄位,是伺服器的域名,比如本機測試的話可以用localhost。使用以下語句
1. keytool -keystore keystore -alias acegisecurity -genkey -keyalg RSA -validity 9999 -storepass password -keypass password
What is your first and last name?(這個就是CN項)回答localhost即可
其他隨便填寫即可。
2. keytool -export -v -rfc -alias acegisecurity -file acegisecurity.txt -keystore keystore -storepass password
這一步是導出key。
3. 復制 acegisecurity.txt 到 %JAVA_HOME%\jre\lib\security
4. 復制 keystore 到 %CATALINA_HOME %
5. 控制台窗口(如果是Windows系統就是dos窗口)下進入 %JAVA_HOME%\jre\lib\security
6. keytool -import -v -file acegisecurity.txt -keypass password - keystore cacerts -storepass changeit -alias acegisecurity
向虛擬機中導入證書
接下來,用編輯器打開%CATALINA_HOME%/conf/server.xml,找到<Connector port="8443" maxHttpHeaderSize="8192"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" disableUploadTimeout="true"
acceptCount="100" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS" />
這一行默認是被注釋掉的,取消注釋,並加入keystoreFile="keystore" keystorePass="password"這兩個屬性,注意keystoreFile屬性可以使用keystore文件的絕對路徑,也可使用基於%CATALINA_HOME%環境變數的相對路徑,keystorePass是訪問keystore的密碼,應和上面製作證書時設定的密碼保持一致。
訪問https://localhost:8443,應彈出一個對話框,告知用戶正要訪問的站點的證書不安全,是否接受,確認接受,應可看到那隻熟悉可愛的小貓。
通過以上步驟就為tomcat配置了ssl。
配置了ssl,然後就是把cas server的war部署到這個tomcat下就可以了,到此,你的cas伺服器就算部署成功了,但是,cas server那個war默認是使用user.properties中的那麼幾個用戶做認證,要實現不同類型的認證方式還需要自己開發,這里不具體講了,可以參考官方文檔,也可以問我。呵呵:)
部署了cas服務,接下來就是接入client application了。
接入application有三種方式,一種是使用acegisecurity,很好用,但是很復雜;一種是使用cas提供的cas client,簡單快捷,適應各種惡劣環境,哈哈;最後一種是lam的一個開源項目,沒試過,不敢說怎麼樣。前兩種不明白可以找官方文檔,也尅問我,哈哈。
就第一個問題說的較詳細,實在打字太多,有點累了。後面的有點粗糙,不過對於有心的人我相信還是很受用的。總結了很久的東西,希望對你有幫助。
⑦ cas單點登錄流程
第一步:訪問cas過濾鏈接ssoLogin,拼湊定向到 CAS_SERVER 獲取ticket的URL
第二步:CAS_SERVER校驗用戶信息,生成Ticket
第三步:重新定向到訪問客戶端的ssoLogin並附加Ticket參數和值
第四步:根據傳來的Ticket拼湊定向到CAS_SERVER的連接去校驗Ticket的合法性
第五步:CAS_SERVER校驗成功後,會返回XML報文並重新定向到訪問客戶端的ssoLogin
解析該XML報文,構造用戶信息對象存儲在session中
然後根據ssoLogin設置的loginSuccessUrl跳轉到登錄成功後的訪問頁面
⑧ CAS 單點登錄問題(求大神解答)
token伺服器是不是應用伺服器,如果不是,注意token的更新。
⑨ cas單點退出
幫你找到這個包了。
http://www.ja-sig.org/downloads/cas-clients/cas-client-3.1.1-release.zip
cas 認證服務參考這個站點
http://www.ja-sig.org/procts/cas/