CAS實(shí)現(xiàn)單點(diǎn)登錄(sso)原理

一蝌箍、什么是單點(diǎn)登錄芭碍?

單點(diǎn)登錄SSO(Single Sign On)說(shuō)得簡(jiǎn)單點(diǎn)就是在一個(gè)多系統(tǒng)共存的環(huán)境下,用戶在一處登錄后寞蚌,就不用在其他系統(tǒng)中登錄,也就是用戶的一次登錄能得到其他所有系統(tǒng)的信任钠糊。單點(diǎn)登錄在大型網(wǎng)站里使用得非常頻繁挟秤,例如像阿里巴巴這樣的網(wǎng)站,在網(wǎng)站的背后是成百上千的子系統(tǒng)抄伍,用戶一次操作或交易可能涉及到幾十個(gè)子系統(tǒng)的協(xié)作艘刚,如果每個(gè)子系統(tǒng)都需要用戶認(rèn)證,不僅用戶會(huì)瘋掉截珍,各子系統(tǒng)也會(huì)為這種重復(fù)認(rèn)證授權(quán)的邏輯搞瘋掉攀甚。

二箩朴、何謂CAS

CAS(Central Authentication Service)是耶魯大學(xué)的一個(gè)開(kāi)源項(xiàng)目,旨在為web應(yīng)用系統(tǒng)提供一種可靠的單點(diǎn)登錄解決方案秋度。采用CAS最大的是從安全性角度來(lái)考慮的炸庞,用戶在CAS錄入用戶名和密碼之后通過(guò)ticket進(jìn)行認(rèn)證,不會(huì)在網(wǎng)上傳輸密碼静陈,保證安全性燕雁。

三、CAS中的關(guān)鍵詞理解

ST(Service Ticket):服務(wù)票據(jù)鲸拥,服務(wù)的唯一標(biāo)識(shí)碼拐格,由TGT生成ST,返回給用戶刑赶,接著拿著生成 的ST去訪問(wèn)service捏浊,service又會(huì)把ST拿到CAS系統(tǒng)去驗(yàn)證,驗(yàn)證通過(guò)后才允許用戶訪問(wèn)該資源撞叨。

TGC( Ticket Granting Cookie):CAS系統(tǒng)用來(lái)識(shí)別用戶身份的憑證金踪。

TGT(Ticket Grangting Ticket):授權(quán)票據(jù),獲取這TGT之后才能申請(qǐng)服務(wù)票據(jù)(ST)牵敷,用戶如果在CAS系統(tǒng)認(rèn)證成功之后胡岔,就會(huì)生成TGC寫(xiě)入瀏覽器,同時(shí)也生成一個(gè)TGT枷餐,TGT對(duì)象的id就是cookie值靶瘸。之后每次請(qǐng)求過(guò)來(lái)通過(guò)此cookie來(lái)從緩存獲取TGT,就不用提交身份認(rèn)證信息(Credentials)毛肋。

Session:各個(gè)應(yīng)用系統(tǒng)會(huì)創(chuàng)建自己的session表示是否登錄怨咪,而這里的每個(gè)session都是ST驗(yàn)證通過(guò)之后組裝生成的。

四 润匙、基礎(chǔ)模式

SSO訪問(wèn)流程主要有以下步驟:

用戶首次登錄時(shí)流程如下:

1)诗眨、用戶瀏覽器訪問(wèn)系統(tǒng)A需登錄受限資源,此時(shí)進(jìn)行登錄檢查孕讳,發(fā)現(xiàn)未登錄匠楚,然后進(jìn)行獲取票據(jù)操作,發(fā)現(xiàn)沒(méi)有票據(jù)厂财。

2)油啤、系統(tǒng)A發(fā)現(xiàn)該請(qǐng)求需要登錄,將請(qǐng)求重定向到認(rèn)證中心蟀苛,獲取全局票據(jù)操作,沒(méi)有逮诲,進(jìn)行登錄帜平。

3)幽告、認(rèn)證中心呈現(xiàn)登錄頁(yè)面,用戶登錄裆甩,登錄成功后冗锁,認(rèn)證中心重定向請(qǐng)求到系統(tǒng)A,并附上認(rèn)證通過(guò)令牌嗤栓,此時(shí)認(rèn)證中心同時(shí)生成了全局票據(jù)冻河。

4)、此時(shí)再次進(jìn)行登錄檢查茉帅,發(fā)現(xiàn)未登錄叨叙,然后再次獲取票據(jù)操作,此時(shí)可以獲得票據(jù)(令牌)堪澎,系統(tǒng)A與認(rèn)證中心通信擂错,驗(yàn)證令牌有效,證明用戶已登錄。

5)樱蛤、系統(tǒng)A將受限資源返給用戶。

已登錄用戶首次訪問(wèn)應(yīng)用群中系統(tǒng)B時(shí):

1)、瀏覽器訪問(wèn)另一應(yīng)用B需登錄受限資源闷煤,此時(shí)進(jìn)行登錄檢查蔬崩,發(fā)現(xiàn)未登錄,然后進(jìn)行獲取票據(jù)操作便脊,發(fā)現(xiàn)沒(méi)有票據(jù)蚂四。

2)、系統(tǒng)B發(fā)現(xiàn)該請(qǐng)求需要登錄就轧,將請(qǐng)求重定向到認(rèn)證中心证杭,獲取全局票據(jù)操作,獲取全局票據(jù)妒御,可以獲得解愤,認(rèn)證中心發(fā)現(xiàn)已經(jīng)登錄。

3)乎莉、認(rèn)證中心發(fā)放臨時(shí)票據(jù)(令牌)送讲,并攜帶該令牌重定向到系統(tǒng)B。

4)惋啃、此時(shí)再次進(jìn)行登錄檢查哼鬓,發(fā)現(xiàn)未登錄,然后再次獲取票據(jù)操作边灭,此時(shí)可以獲得票據(jù)(令牌)异希,系統(tǒng)B與認(rèn)證中心通信,驗(yàn)證令牌有效,證明用戶已登錄绒瘦。

5)称簿、系統(tǒng)B將受限資源返回給客戶端扣癣。

五、cas登出流程

用戶發(fā)起登出請(qǐng)求動(dòng)作

APP將登出請(qǐng)求轉(zhuǎn)發(fā)到CAS Server的logou接口

CAS server接受請(qǐng)求后憨降,會(huì)檢測(cè)用戶的TGC Cookie是否存在父虑,如果存在即銷(xiāo)毀該用戶對(duì)應(yīng)的TGT和CAS服務(wù)器的session信息。

CAS Server根據(jù)登錄過(guò)的ServerURL向APP發(fā)出登出請(qǐng)求授药。

APP LogOut Filter會(huì)解析這個(gè)參數(shù)士嚎,取得sessionId,根據(jù)這個(gè)Id取得session后悔叽,把session刪除莱衩,將session中的Service Ticket清除掉。

六骄蝇、輔助說(shuō)明

CAS的SSO實(shí)現(xiàn)方式可簡(jiǎn)化理解為:1個(gè)Cookie和N個(gè)Session膳殷。CAS Server創(chuàng)建cookie,在所有應(yīng)用認(rèn)證時(shí)使用九火,各應(yīng)用通過(guò)創(chuàng)建各自的Session來(lái)標(biāo)識(shí)用戶是否已登錄赚窃。

用戶在一個(gè)應(yīng)用驗(yàn)證通過(guò)后,以后用戶在同一瀏覽器里訪問(wèn)此應(yīng)用時(shí)岔激,客戶端應(yīng)用中的過(guò)濾器會(huì)在session里讀取到用戶信息勒极,所以就不會(huì)去CAS Server認(rèn)證。如果在此瀏覽器里訪問(wèn)別的web應(yīng)用時(shí)虑鼎,客戶端應(yīng)用中的過(guò)濾器在session里讀取不到用戶信息辱匿,就會(huì)去CAS Server的login接口認(rèn)證,但這時(shí)CAS Server會(huì)讀取到瀏覽器傳來(lái)的cookie(TGC)炫彩,所以CAS Server不會(huì)要求用戶去登錄頁(yè)面登錄匾七,只是會(huì)根據(jù)service參數(shù)生成一個(gè)Ticket,然后再和web應(yīng)用做一個(gè)驗(yàn)證ticket的交互而已江兢。

七昨忆、對(duì)問(wèn)題的統(tǒng)一回答

1)、問(wèn):系統(tǒng)A是如何發(fā)現(xiàn)該請(qǐng)求需要登錄重定向到認(rèn)證中心的杉允?

答:用戶通過(guò)瀏覽器地址欄訪問(wèn)系統(tǒng)A邑贴,系統(tǒng)A(也可以稱(chēng)為CAS客戶端)去Cookie中拿JSESSION,即在Cookie中維護(hù)的當(dāng)前回話session的id叔磷,如果拿到了拢驾,說(shuō)明用戶已經(jīng)登錄,如果未拿到改基,說(shuō)明用戶未登錄繁疤。

2)、問(wèn):系統(tǒng)A重定向到認(rèn)證中心,發(fā)送了什么信息或者地址變成了什么嵌洼?

答:假如系統(tǒng)A的地址為http://a:8080/案疲,CAS認(rèn)證中心的服務(wù)地址為http://cas.server:8080/,那么重點(diǎn)向前后地址變化為:http://a:8080/————>ttp://cas.server:8080/?service=http://a:8080/麻养,由此可知,重點(diǎn)向到認(rèn)證中心诺舔,認(rèn)證中心拿到了當(dāng)前訪問(wèn)客戶端的地址鳖昌。

3)、問(wèn):登錄成功后低飒,認(rèn)證中心重定向請(qǐng)求到系統(tǒng)A许昨,認(rèn)證通過(guò)令牌是如何附加發(fā)送給系統(tǒng)A的?

答:重定向之后的地址欄變成:http://a:8080/?ticket=ST-XXXX-XXX褥赊,將票據(jù)以ticket為參數(shù)名的方式通過(guò)地址欄發(fā)送給系統(tǒng)A

4)糕档、問(wèn):系統(tǒng)A驗(yàn)證令牌,怎樣操作證明用戶登錄的拌喉?

答:系統(tǒng)A通過(guò)地址欄獲取ticket的參數(shù)值ST票據(jù)速那,然后從后臺(tái)將ST發(fā)送給CAS server認(rèn)證中心驗(yàn)證,驗(yàn)證ST有效后尿背,CAS server返回當(dāng)前用戶登錄的相關(guān)信息端仰,系統(tǒng)A接收到返回的用戶信息,并為該用戶創(chuàng)建session會(huì)話田藐,會(huì)話id由cookie維護(hù)荔烧,來(lái)證明其已登錄。

5)汽久、問(wèn):登錄B系統(tǒng)鹤竭,認(rèn)證中心是如何判斷用戶已經(jīng)登錄的?

答:在系統(tǒng)A登錄成功后景醇,用戶和認(rèn)證中心之間建立起了全局會(huì)話臀稚,這個(gè)全局會(huì)話就是TGT(Ticket Granting Ticket),TGT位于CAS服務(wù)器端啡直,TGT并沒(méi)有放在Session中烁涌,也就是說(shuō),CAS全局會(huì)話的實(shí)現(xiàn)并沒(méi)有直接使用Session機(jī)制酒觅,而是利用了Cookie自己實(shí)現(xiàn)的撮执,這個(gè)Cookie叫做TGC(Ticket Granting Cookie),它存放了TGT的id,保存在用戶瀏覽器上舷丹。

相關(guān)內(nèi)容分析可以查看:《SSO CAS單點(diǎn)系列》之 實(shí)操抒钱!輕松玩轉(zhuǎn)SSO CAS就這么簡(jiǎn)單(相識(shí)篇)

用戶發(fā)送登錄系統(tǒng)B的請(qǐng)求,首先會(huì)去Cookie中拿JSESSION,因?yàn)橄到y(tǒng)B并未登錄過(guò)谋币,session會(huì)話還未創(chuàng)建仗扬,JSESSION的值是拿不到的,然后將請(qǐng)求重定向到CAS認(rèn)證中心蕾额,CAS認(rèn)證中心先去用戶瀏覽器中拿TGC的值早芭,也就是全局會(huì)話id,如果存在則代表用戶在認(rèn)證中心已經(jīng)登錄诅蝶,附帶上認(rèn)證令牌重定向到系統(tǒng)B退个。

上面登錄狀態(tài)判斷也是這個(gè)邏輯。

6)调炬、問(wèn):登出的過(guò)程语盈,各個(gè)系統(tǒng)對(duì)當(dāng)前用戶都做了什么?

答:認(rèn)證中心清除當(dāng)前用戶的全局會(huì)話TGT缰泡,同時(shí)清掉cookie中TGT的id:TGC刀荒;

然后是各個(gè)客戶端系統(tǒng),比如系統(tǒng)A棘钞、系統(tǒng)B缠借,清除局部會(huì)話session,同時(shí)清掉cookie中session會(huì)話id:jsession

這篇文章先寫(xiě)到這里武翎,在下一篇文章我會(huì)詳細(xì)寫(xiě)下搭建cas服務(wù)器和客戶端的步驟

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末烈炭,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子宝恶,更是在濱河造成了極大的恐慌符隙,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,682評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件垫毙,死亡現(xiàn)場(chǎng)離奇詭異霹疫,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)综芥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)丽蝎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人膀藐,你說(shuō)我怎么就攤上這事屠阻。” “怎么了额各?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,083評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵国觉,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我虾啦,道長(zhǎng)麻诀,這世上最難降的妖魔是什么痕寓? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,763評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮蝇闭,結(jié)果婚禮上呻率,老公的妹妹穿的比我還像新娘。我一直安慰自己呻引,他們只是感情好礼仗,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著逻悠,像睡著了一般藐守。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蹂风,一...
    開(kāi)封第一講書(shū)人閱讀 51,624評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音乾蓬,去河邊找鬼惠啄。 笑死,一個(gè)胖子當(dāng)著我的面吹牛任内,可吹牛的內(nèi)容都是我干的撵渡。 我是一名探鬼主播,決...
    沈念sama閱讀 40,358評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼死嗦,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼趋距!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起越除,我...
    開(kāi)封第一講書(shū)人閱讀 39,261評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤节腐,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后摘盆,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體翼雀,經(jīng)...
    沈念sama閱讀 45,722評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年孩擂,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了狼渊。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,030評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡类垦,死狀恐怖狈邑,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蚤认,我是刑警寧澤米苹,帶...
    沈念sama閱讀 35,737評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站烙懦,受9級(jí)特大地震影響驱入,放射性物質(zhì)發(fā)生泄漏赤炒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評(píng)論 3 330
  • 文/蒙蒙 一亏较、第九天 我趴在偏房一處隱蔽的房頂上張望莺褒。 院中可真熱鬧,春花似錦雪情、人聲如沸遵岩。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,941評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)尘执。三九已至,卻和暖如春宴凉,著一層夾襖步出監(jiān)牢的瞬間誊锭,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,057評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工弥锄, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留丧靡,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,237評(píng)論 3 371
  • 正文 我出身青樓籽暇,卻偏偏與公主長(zhǎng)得像温治,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子戒悠,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容