cookie單點登入

2022-02-20 08:09:47 字數 1497 閱讀 5192

新近一家公司上來就讓做oa,要求嵌入公司現有系統模組,自然而然想到模擬post單點登入對方系統新建單點登陸頁面儲存session,然現有系統都有用cookie儲存使用者資訊,故儲存本地cookie……測試失敗。網上查詢得知,生成的cookie所在的domainname不同所致,也就是存在cookie跨域訪問問題。

因為現有相同都是ip+埠訪問方式,故無法使用二級網域名稱共享cookie,現想到方法就是利用iframe來實現sso,解決方法如下:

主系統通過js建立隱藏iframe(src路徑即為子系統所建ashx頁面)

//建立隱藏iframe呼叫單點登入頁面實現cookie跨域共享

var sso_frm = document.createelement("iframe");

sso_frm.style.display = "none";

sso_frm.src = "@[email protected][email protected]";

子系統新建乙個ashx頁面,接收引數並寫入cookie (**略),這個方法取了個巧,相當於變相的登入了其他系統,唯一不足之處就是在主平台登入時需要遍歷所有許可權內子系統建立iframe並登入,這個方法可以很好地處理不同主域下的單點登入。

擴充套件

1)對於相同主域下的二級網域名稱我們可以利用二級網域名稱共享cookie實現單點登入如:站點a登入後建立cookie,設定主域:cookie.domain = "sso.com",此時b登入可直接獲取a建立的cookie。

2)對於不同主域下的單點登入除了利用iframe還可以借助統一認證站點(passport.com)來實現單點登入

例如」站點a   www.a.com

站點b   www.b.com

認證站點c   www.passport.com

票據:ticket加密的賬號密碼以cookie形式存在。

認證過程:假設使用者user1未曾登入過站點ab,  a登入後判斷 a_ticket(user1加密賬號密碼)是否存在,否則跳轉站點c驗證頁面,登入成功後生成c_ticket(加密賬號密碼)並返回a站a_ticket;而後b站點登入會重定向站點c 驗證c_ticket驗證成功返回b_ticket並重定向b。

3) 我們也可以利用redis來替換認證站點c 處理邏輯與上述過程類似:

1.user1訪問站點a,如果a_ticket存在則正常登入,否則判斷快取中是否存在以user1賬號為key的值(user1賬號密碼加密),如果存在即返回該值並寫入a_ticket,如果不存在即跳轉站點a登入頁登入後建立user1的redis快取並建立a_ticket;

2.user1訪問站點b,如果b_ticket存在則正常登入,否則判斷快取中是否存在以user1賬號為key的值(user1賬號密碼加密),如果存在即返回該值並寫入b_ticket,如果不存在則挑戰站點b登入頁面登入後建立

user1的redis快取並建立b_ticket;

總結:寫的有點碎,但是大體意思應該表達清楚了,實現起來也比較簡單就不再贅述。

跨域 Cookie 實現單點登入

單點登入 sso single sign on 對於同乙個客戶端 例如 chrome 瀏覽器 只要登入了乙個子站 例如 a.com 則所有子站 b.com c.com 都認為已經登入。比如使用者在登入 後,跳轉到天貓時就已經登入了。未登入使用者訪問子站 a.com 進行登入,自動跳轉到賬戶中心的統一...

使用cookie實現sso單點登入

思路 有a b,c 三個應用,a,提供登入退出服務,bc為使用者端,同乙個瀏覽器下利用cookie 中的token 進行登入校驗,b登入服務時檢驗token是否存在,如果存在則b服務在後端拿個token向a後端提供的獲取使用者資訊介面,獲取登入資訊 如果不存在,則跳轉到a服務的登入頁並攜帶登陸成功後...

Java基於Cookie的單點登入 SSO 實現

驅動 公司有兩個系統希望實現單點登入功能,故此研究 三個應用服務必須在同乙個頂級網域名稱下,例如 aaa.baidu.com bbb.baidu.com 主要思想 cookie在不同網域名稱下時不能共享的,所以我們需要乙個相同的頂級網域名稱,在使用者登入操作完成的時候我們向頂級網域名稱 下寫入coo...