您的位置:首页 > 其它

通过设置P3P头来实现跨域访问COOKIE

2011-12-07 10:20 651 查看
今天看到一篇不错的关于做sso的文章,分享给大家:

Passport 一方面意味着用一个帐号可以在不同服务里登录,另一方面就是在一个服务里面登录后可以无障碍的漫游到其他服务里面去。

以前亿邮的邮件系统在和别的系统整合的时候是提供一个 URL,用户从第三方系统里面点击这个链接就可以生成访问邮件界面所需的 cookie,然后进入邮件。这个方式的确很有效,但问题是:

1. 每个外部链接都必须用特殊的 URL 跳转,维护很麻烦

2. 两个系统集成已经很麻烦了,若是集成的系统有好几个,彼此都需要跳转而缺乏一个中心机制就成了噩梦

3. 根本无法处理用户直接在地址栏输入地址进行访问的情况

即使是跨域,上述的解决方法相对来说还是容易的。

A. 首先是所有登录必须首先通过一个中央服务器进行认证,然后在它那里给浏览器种下 cookie(下面称之为 sso cookie)

B. 当用户访问另外的域名 app 的时候,浏览器是无法直接发送 sso cookie 给服务器认证的。此时应该利用 javascript,动态创建一个隐藏的 iframe,让其访问 sso

C. 这个 iframe. 的请求是可以把 sso cookie 送给 sso server 的。sso server 验证 cookie 后,返回一个重定向页面到 app 的某个 URL,由该 URL 设置 app cookie

D. 此时浏览器上可看见的页面容器实际上也是可以和重定向回来的内容交互的。比如可以用 js 控制发现重定向页面成功返回后,就刷新整个页面,让它看起来和用户登录后访问没有什么区别。

下面是真正的技巧:怎样才能在 IE 里面跨域去设置 cookie

上述技术看起来是不是很好?但它的前提是所有的登录都 post 到 sso server 上,认证成功后再返回 app 页面。可我接受到的需求之一就是要支持页面无刷新登录。

哈!就是说本来在 chinaren.com 上提交登录表单的 action 应该是 passport.sohu.com 这个 sso server。可是在 AJAX 大潮下,chinaren 计划采用 XMLHTTPRequest 提交,这个就麻烦了,因为是不能跨域来提交的。

那么解决方法就是跨域产生 cookie,即 js 发现口令校验成功后,再在 passport.sohu.com 上种上合法的 cookie.

套用上面的跨域读 cookie 的方案似乎很简单去推论:就是创建一个隐含的 iframe,让那个 iframe. 去调用 passport.sohu.com 的 URL 来产生 cookie。很遗憾,此方法在 Fx 下工作的很好,但是不能在 IE 上应用。(在 IE 状态栏上显示 cookie 隐私警告,红色圆底白横杠)

我试了很多很多方法,包括创建 、 node,包括用 js 设置,但都一次次被 IE 无情的挡在了浏览器外。google 之,也没有任何真正可用的答案,中文网页要么介绍的方法是错的,要么说无解。

最后还是在 chinaren 一哥们的帮助下,翻出了他们所使用的,以和 alumni.sohu.com 交互的方法(不知道是哪位牛人发现的),只需要设置 P3P HTTP Header,在隐含 iframe. 里面跨域设置 cookie 就可以成功。他们所用的内容是:

P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"

cookie 怎么在 vmx.cn 和 dup2.net 之间交互

2. 随便输入什么,点 reset cookie,就可以看到 vmx.cn 的 cookie 已经被设上了

3. 在该页面点连接到 http://www.dup2.net/vmx/cookie.html
4. 点"get corss-domain cookie" .. (此时 js 会去创建一个iframe,请求 qiuyingbo.test.vmx.cn ,返回页面把 cookie 值作为 GET 参数重定向回 dup2.net 的另外一个URL。)

5. 点 "display corss-domain cookie" .. 就可以看到 vmx.cn 的 cookie 了

6. 在该页面的输入框中输入其它的值,然后点 "set cross-domain cookie",该行为将主动设置 vmx.cn 的 cookie

7. 点链接回到 http://qiuyingbo.test.vmx.cn/cookie.php ,就可以看到新的值了

--

如果 iframe另一个页面,登录容易丢失,如博客里采用了二级域名,那么用户在二级域名中不能登录。如果两套系统整合,登录时也容易这样,这是IE的安全限制。这里有一个简单方法解决。

问题描述:我们这边有两个系统,一个OA系统,基于LOTUS的,现在我们用asp.net做了几个应用模块,需要集成到OA系统中,需要实现一个后来隐藏登录,利用iframe实现,但是发现,iframe引用的页面,直接通过浏览器是可以访问的,但是通过ifame就不可以了。难道是iframe的问题。
于是,我google了一下:“iframe cookie”,竟然有很多人讨论!不久就基本上确认了我当时推测。IE6.0对W3C 关于cookie的P3P协议的支持,支持得有些荒唐,几乎成了bug。
有人说,可以设置一下IE的cookie隐私,就好了,不用对程序做任何改动。但是,总不能要求所有用户这么做吧。
再找,呵呵,问题终于解决了
问题原因:
在frameset里面,也就是里面的frame是来自第三方站点(不同IP或不同域名),那么默认情况下IE会自动禁用这些站点的cookie,也就是在请求某url时在HTTP header里不发送它们的cookie,包括session的cookie。注意,这些站点在response里面设置的cookie还是会被发送到浏览器的。
解决方法:
对frame里面的引用站点的response header里面添加一个确认信息,在MSDN里面有个最简单的

解决办法:response.addHeader("P3P","CP=CAO PSA OUR")。
所有我们可以通过增加一个网站http头来解决问题;
管理工具——〉选择一个网站——〉属性——〉http头,增加一个http头
然后输入头名:P3P
输入头内容:CP=CAO PSA OUR
注意:可以只选择某一个目录!
好了,ok了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: