用戶訪問app系統(tǒng),app系統(tǒng)是需要登錄的,但用戶現(xiàn)在沒有登錄。
跳轉(zhuǎn)到CAS server,即SSO登錄系統(tǒng), SSO系統(tǒng)也沒有登錄,彈出用戶登錄頁。
用戶填寫用戶名、密碼,SSO系統(tǒng)進(jìn)行認(rèn)證后,將登錄狀態(tài)寫入SSO的session,瀏覽器(Browser)中寫入SSO域下的Cookie。
SSO系統(tǒng)登錄完成后會生成一個ST(Service Ticket),然后跳轉(zhuǎn)到app系統(tǒng),同時將ST作為參數(shù)傳遞給app系統(tǒng)。
app系統(tǒng)拿到ST后,從后臺向SSO發(fā)送請求,驗證ST是否有效。
驗證通過后,app系統(tǒng)將登錄狀態(tài)寫入session并設(shè)置app域下的Cookie。
至此,跨域單點登錄就完成了。以后我們再訪問app系統(tǒng)時,app就是登錄的。接下來,我們再看看訪問app2系統(tǒng)時的流程。
用戶訪問app2系統(tǒng),app2系統(tǒng)沒有登錄,跳轉(zhuǎn)到SSO。
由于SSO已經(jīng)登錄了,不需要重新登錄認(rèn)證。
SSO生成ST,瀏覽器跳轉(zhuǎn)到app2系統(tǒng),并將ST作為參數(shù)傳遞給app2。
app2拿到ST,后臺訪問SSO,驗證ST是否有效。
驗證成功后,app2將登錄狀態(tài)寫入session,并在app2域下寫入Cookie。
這樣,app2系統(tǒng)不需要走登錄流程,就已經(jīng)是登錄了。SSO,app和app2在不同的域,它們之間的session不共享也是沒問題的。
SSO系統(tǒng)登錄后,跳回原業(yè)務(wù)系統(tǒng)時,帶了個參數(shù)ST,業(yè)務(wù)系統(tǒng)還要拿ST再次訪問SSO進(jìn)行驗證,假如SSO登錄認(rèn)證通過后,通過回調(diào)地址將用戶信息返回給原業(yè)務(wù)系統(tǒng),原業(yè)務(wù)系統(tǒng)直接設(shè)置登錄狀態(tài),這樣流程簡單,也完成了登錄,不是很好嗎?
其實這樣問題時很嚴(yán)重的,如果我在SSO沒有登錄,而是直接在瀏覽器中敲入回調(diào)的地址,并帶上偽造的用戶信息,是不是業(yè)務(wù)系統(tǒng)也認(rèn)為登錄了呢?這是很可怕的