CAS如何解決單點登錄後跨域安全的問題

    給客戶開發企業門戶系統,其中門戶使用的是開源門戶Liferay6.1。單點登錄服務使用的是CAS。
門戶使用IFRAME集成了客戶原有的所有 Web系統,門戶成爲所有Web系統的統一入口。在調試CAS時發現,在門戶中通過iframe的方式訪問其它系統,使用IE總是需要重新登錄,其它瀏覽器沒有這個問題。
經過分析發現客戶所有的web系統都是使用IP地址訪問的方式,也即都是跨域訪問。子系統獲取loginTicket時的sessionId和post過去時的sessionid不一致。
查資料知道IE6/IE7支持的P3P(Platform for Privacy Preferences Project (P3P) specification)協議默認阻止第三方無隱私安全聲明的cookie,火狐和谷歌目前還不支持P3P安全特性,所以它們不存在此問題了。
網上的解決方法:在第一次獲取loginTicket時在response中設置p3p聲明,如下:
           response.setHeader("P3P", "CP=CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR");
           修改代碼後,錯誤依舊。
後面仔細分析了 CAS的源碼,需要修改以下代碼:
    AbstractTicketValidationFilter類中增加以下代碼:
final HttpServletRequest request = (HttpServletRequest) servletRequest;
        final HttpServletResponse response = (HttpServletResponse) servletResponse;
  response.addHeader("P3P","CP=\"IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT\"");
  
重新部署後,問題解決。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章