需求:
系統(tǒng)A與系統(tǒng)B分別部署在不同域的兩臺服務(wù)器中,但它們的身份都統(tǒng)一在身份認(rèn)證服務(wù)器中;身份認(rèn)證信息以Session方式存貯于各自系統(tǒng)中,并輔以cookie進(jìn)行使用。
當(dāng)用戶在A系統(tǒng)登錄后,訪問B系統(tǒng)時,由于是跨域訪問,導(dǎo)致身份信息不能正確的傳遞到B系統(tǒng)中,從而致使用戶需在B系統(tǒng)中重新登錄。
解決方案:
處理這類跨域訪問時,我們最先使用從B系統(tǒng)向C通過HttpRequest(類AJAX請求)的方式獲取身份信息,此方式好處是同步處理,方便用使用;但其限制諸多,如需設(shè)置信任站點、用戶訪問確認(rèn)等,甚至,在對應(yīng)用服務(wù)器作了一次安全升級后,根本無法訪問了。因此,需另行開辟途徑,于是,在同事建議下,我們使用IFrame內(nèi)嵌跨域驗證網(wǎng)頁,來解決此問題。
1、原理設(shè)計:用戶在訪問B系統(tǒng)時,先使用一內(nèi)置的iframe,并將iframe的src指向身份認(rèn)證服務(wù)器系統(tǒng)代理驗證接口;如果用戶已經(jīng)在A系統(tǒng)中進(jìn)行過登錄,即A域了中已存在著身份認(rèn)證信息后,身份認(rèn)證服務(wù)器中也將具有其身份信息將其附帶著身份認(rèn)證信息后重定向訪問B系統(tǒng)代理接口;B系統(tǒng)代理驗證接口在接收到由A系統(tǒng)傳遞而來的身份認(rèn)證信息后,通過身份認(rèn)證服務(wù)器驗證后,在B系統(tǒng)所在域重建身份認(rèn)證信息。
2、實現(xiàn)邏輯貼碼:
1)B系統(tǒng)代理驗證接口:
(1)IFrame邏輯貼碼:
(2)JS檢測是否通過認(rèn)證邏輯貼碼:
2)身份認(rèn)證服務(wù)器端接口(JSP):
3、注意事項:
1)由于身份認(rèn)證中心使用cookie作為身份標(biāo)識,因此,需要用戶在瀏覽器中允許使用cookie的設(shè)置;
2)由于在iframe中進(jìn)行跨域重定向,因此需在IE安全中的跨域瀏覽子框架項設(shè)為啟用:
4、源碼文件:
……