前两天尝试使用 jsonp 跨域提交用户名密码请求,实现自动登录第三方网站,即 SSO(single-sign-on) 单点登录,一处登录处处登录。在 Firefox下没问题,IE 却不行。查看 HTTP 的几个来回,发现登录请求是成功的,问题出在第三方网站返回的 cookie (session id) IE 并没有接受,下一次发送请求时根本没有带上 cookie,说明之前的 Set-Cookie 指令没有效果,所以怎么也登录不了。查了一下,有人使用 iframe 内嵌网页的形式,也遇到了 IE 下不能设置 cookie 的情况。
如果在“Internet选项”->“隐私”->“高级”中把“替代Cookie自动处理”勾选上(这是IE9的设置,版本低的IE需要把隐身级别设置为低,就没问题了。但是我们不可能让每个用户去更改 IE 设定吧?这是一个很常遇到的场景,肯定有别的解决办法。
浏览器的第三方 cookie 限制
所谓第三方 cookie,就是说你访问网页 A,却接收到域名 B 的 cookie 设定指令。这可能是由于网页 A 请求或链接了 B 的网页,比如上面提到的 iframe 以及 jsonp。
我查到了各个浏览器对于跨域的处理规则,可以看到第三方 cookie ,IE 在默认设置中是做了限制的。
IE |
FireFox |
Chrome |
Safari |
Opera |
|
限制第三方coookie |
是 |
否 |
否 |
是 |
否 |
要解决这个问题,有 2 种方法,一个就是上面说到的调整 IE 设置,将第三方域名加入到可信网站列表中;另一个方法,就是 P3P 了。
P3P?
P3P 全称 Platform for Privacy Preferences,隐私设定平台规范。这个规范极其复杂,若要讲清楚,天都黑了一半。简言之,就是网站向浏览器声明自己的隐私政策,比如网站是否搜集访问者的个人信息,设置 cookie 的用途等等。浏览器会依据设置,决定在第三方请求的条件下是否接受网站的 cookie。
完整地部署 P3P 包括设立隐私政策文件(policy.html)、原则档(policy.xml)、参考档(p3p.xml),有兴趣详细了解的可以参考 MSDN 中关于部署 P3P的文章。
这搞得太复杂了,我只是想在公司内部做各个管理系统的单点登录而已。好在还是有比较简单的方法的,就是发送 P3P 相关的 HTTP header。
ASP.NET:
HttpContext.Current.Response.AddHeader("p3p", "CP=\"IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT\"");
PHP:
header('P3P:CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"');
JSP:
response.setHeader("P3P","CP='IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT'");
好吧,这些 IDC DSP 什么的是啥意思啊?
这些标签就是 P3P 所规定的了,例如 NOI 表示不搜集可识别用户的资料,ADM 表示信息搜集会用于网站管理……
浏览器会根据这些标签决定是否接受 cookie,根据测试结果,加上 NOI 最省事,一个就够了。不过网站一般很难做到 NOI,除非永远匿名,“登录”功能可能就违背了NOI。理论上讲,标签应该真实地反映网站的信息搜集行为,若声明的隐私政策与实际行为不符,是会要负法律责任的。Stackoverflow 有篇讨论提出了法律相关议题,可以参考。
除了传送 P3P http header,还可以通过 HTML meta 标签,或者 设定 IIS 服务器 来声明 P3P。
参考链接:http://www.lovelucy.info/ie-accept-third-party-cookie.html
PS:查看好几篇类似JSP中使用P3P解决跨域的方法,发现P3P的值不太一样,但在IE9下都是正确的,在此记录一下:
response.setHeader("P3P","CP='IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT'"); response.setHeader("P3P","CP=\"NON DSP COR CURa ADMa DEVa TAIa PSAa PSDa IVAa IVDa CONa HISa TELa OTPa OUR UNRa IND UNI COM NAV INT DEM CNT PRE LOC\""); response.setHeader("P3P","CP=CAO PSA OUR"); response.setHeader("P3P","CP='CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR'");
相关推荐
P3P是一種被稱為個人隱私安全平臺項目(the Platform for Privary Preferences)的標準,能夠保護在線隱私權,使Internet衝浪者可以選擇在瀏覽網頁時,是否被第三方收集並利用自己的個人信息。如果一個站點不遵守...
本话题主要围绕如何在基于Vue CLI的项目中实现根据不同的环境调用不同的接口,解决本地代理跨域问题以及第三方资源的分离打包。以下是详细的解释和步骤: 1. **环境变量与接口调用**: - 在Vue CLI项目中,通常会...
【标题】"Dubbox跨域请求、Cookie设置"所涉及的知识点主要集中在分布式服务框架Dubbo的跨域问题处理和Cookie的配置上。Dubbox是阿里巴巴开源的一个基于Dubbo的扩展,提供了更多的特性,如REST支持、Zookeeper注册...
例如,在IE浏览器中,若要在跨域情况下设置cookie,可以通过在服务器端的响应头中添加P3P策略声明,这样浏览器就能根据P3P声明的隐私政策来决定是否允许跨域cookie访问。 根据提供的文档内容,实现跨域cookie设置的...
因为网站系统的日益庞大,不同域名业务,甚至不同合作方网站的cookie可能或多或少需要进行共享使用,遇到这个情况的时候,大家一般想到的是使用登录中心分发cookie状态再进行同步进行解决,成本较高而且实施起来比较...
要让Axios在跨域请求中携带Cookie,我们需要设置`withCredentials`属性为`true`。在前端代码中,我们可以这样做: ```javascript import axios from 'axios'; const service = axios.create({ baseURL: process....
### 跨域访问解决方案与Cookie处理 在现代Web开发中,跨域问题一直是困扰开发者的一大难题。当浏览器出于安全考虑阻止不同源之间的数据交互时,跨域问题便产生了。为了解决这一问题,并确保在跨域场景下可以正确地...
通过这种方式,可以解决在IE浏览器中由于P3P隐私设置导致的iframe跨域cookie丢失问题,进而解决session失效导致的用户频繁重新登录的问题。这个方法在技术上是可行的,但需要网站管理员操作,确保P3P声明符合实际的...
解决跨域页面访问问题的办法是,在子系统的登录代码中加入 P3P 的认证,即允许第三方读取 cookie,这样 cookie 值才能被浏览器正确的读取并保存。P3P(Platform for Privacy Preferences)是一种隐私保护协议,允许...
深入分析:出于隐私安全的考虑,IE 会丢失 Iframe 中的 Cookie,IE6/IE7 支持的 P3P(Platform for Privacy Preferences Project specification)协议默认阻止第三方无隐私安全声明的 Cookie,Firefox、Chrome 不...
标题 "IE7 Ajax跨域问题" 涉及到的是在使用Ajax技术在Internet Explorer 7(IE7)浏览器中处理跨域请求时遇到的挑战。在Web开发中,Ajax(Asynchronous JavaScript and XML)是一种在不刷新整个页面的情况下与服务器...
有别于JS跨域、IFRAME跨域等的常用处理办法,还可以利用P3P来实现跨域。P3P是什么P3P(Platform ...访问支持P3P网站的用户有权查看站点隐私报告,然 后决定是否接受cookie 或是否使用该网站。 如何利用P3P实现跨域在开
解决方法是: 代码如下: //www.B.com里的被调用的页面需要写P3P头,从而解除IE对写Cookie的阻止 context.Response.AddHeader(“P3P”, “CP=CAO PSA OUR”); //www.A.com里通过ajax调用www.B.com里的内容时,是跨域...
解决ie8、9Ajax跨域问题(前端):jsp引入此js,Jquery Ajax正常写
该文件可以通过代码实例,让你清楚的理解session和cookie的意思,当你明白了这点,你就可以设计出来单点登录功能,同一账号在同一时间只能登录一次功能。同时你可以通过ie、firefox去测试你对session、cookie的理解...
利用flash让IE7.8.9ajax支持跨域 使用方法: https://blog.csdn.net/liguanjie8/article/details/85245815#extswflwkpost_100
cookie跨域后端代码,主要解决跨域的问题,在servlet部分,供初学者使用
**三、window.name跨域通信详解** 1. **原理**:`window.name`不受同源策略限制,可以在任何页面中读写,即使页面被刷新或导航至其他URL,`window.name`的值依然保留。因此,可以利用这一点在父页面和iframe之间...