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