新近一家公司上來就讓作oa,要求嵌入公司現有系統模塊,天然而然想到模擬post單點登陸對方系統新建單點登錄頁面保存session,然現有系統都有用cookie保存用戶信息,故保存本地cookie……測試失敗。網上查詢得知,生成的cookie所在的domainName不一樣所致,也就是存在cookie跨域訪問問題。javascript
由於現有相同都是ip+端口訪問方式,故沒法使用二級域名共享cookie,現想到方法就是利用iframe來實現SSO,解決方法以下:java
主系統經過js建立隱藏iframe(src路徑即爲子系統所建ashx頁面)redis
//建立隱藏iframe調用單點登陸頁面實現cookie跨域共享 var sso_frm = document.createElement("iframe"); sso_frm.style.display = "none"; sso_frm.src = "@ViewBag.SSO_Url?uid=@ViewBag.uid&pwd=@ViewBag.pwd"; document.body.appendChild(sso_frm);
子系統新建一個ashx頁面,接收參數並寫入cookie (代碼略),這個方法取了個巧,至關於變相的登陸了其餘系統,惟一不足之處就是在主平臺登陸時須要遍歷全部權限內子系統建立iframe並登陸,這個方法能夠很好地處理不一樣主域下的單點登陸。跨域
擴展:緩存
1)對於相同主域下的二級域名咱們能夠利用二級域名共享cookie實現單點登陸如:站點A登陸後建立cookie,設置主域:cookie.Domain = "sso.com",此時B登陸可直接獲取A建立的cookie。cookie
2)對於不一樣主域下的單點登陸除了利用iframe還能夠藉助統一認證站點(passport.com)來實現單點登陸session
例如」app
站點A www.a.comdom
站點B www.b.compost
認證站點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;
總結:寫的有點碎,可是大致意思應該表達清楚了,實現起來也比較簡單就再也不贅述。