iframe、跨域 cookie、p3p 策略和 safari 错误:未提供所需的防伪令牌或无效
Posted
技术标签:
【中文标题】iframe、跨域 cookie、p3p 策略和 safari 错误:未提供所需的防伪令牌或无效【英文标题】:Iframe, cross-domain cookies, p3p policy, and safari with error: A required anti-forgery token was not supplied or was invalid 【发布时间】:2011-09-01 19:34:47 【问题描述】:我不久前问过这个question,发现IE 会阻止iframe 中的跨域cookie,除非您设置p3p policy。到目前为止,p3p 修复在 ie 中运行良好。但是,现在我们在 safari 中遇到了同样的错误。
我发现一篇带有不同 p3p policy 的文章用于 safari。我添加了此代码来设置 p3p 策略,但我仍然收到请求验证令牌错误。
public static void SetP3PCompactPolicy()
HttpContext current = HttpContext.Current;
if (current.Request.UserAgent.ToLower().IndexOf("safari") >= 0)
HttpContext.Current.Response.AddHeader("p3p", "CP=\"IDC DSP COR CURa ADMa OUR IND PHY ONL COM STA\"");
else
HttpContext.Current.Response.AddHeader("p3p", "CP=\"IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT\"");
我不确定这意味着什么,但它不适用于 Safari (5)。
此外,当我收到服务器错误时,所有信息都会在报告中发送给我,包括所有 http 标头。 p3p 标头永远不会出现在这些错误中。我不确定这是设计使然,还是表明问题正在发生。
【问题讨论】:
【参考方案1】:问题在于 Safari 不允许在 iframe 中设置 cookie,除非用户与该 iframe 交互。对于某些人来说,这意味着点击链接。我找到了一个更好的解决方案,那就是进行重定向。
首先,我把这个表格放在我的页面上。实际上,我将它放在 iframe 中提供的每个视图所使用的母版页中。
<% if(SecurityHelper.BrowserIsSafari) %>
<% using (html.BeginForm("SafariRedirect", "Framed", FormMethod.Post, new id="safari-fix-form" )) %>
<%: Html.Hidden("safariRedirectUrl")%>
<% %>
<% %>
因为我只希望它在用户使用 safari 时工作,所以我在静态帮助器类中创建了这个属性来检查用户代理
public static bool BrowserIsSafari
get return HttpContext.Current.Request.UserAgent.ToLower().IndexOf("safari") >= 0;
然后,在我的控制器中,我有以下操作
[HttpPost]
public ActionResult SafariRedirect(string safariRedirectUrl)
Response.Cookies.Add(new HttpCookie("safari_cookie_fix", "cookie ok"));
return Redirect(safariRedirectUrl);
在我的母版页的页眉中,我在同一 if 语句中声明了我的脚本,该语句确定是否呈现表单。在我的脚本文件中,我有这个 jquery
$(function ()
if ($.browser.safari == true && document.cookie.indexOf("safari_cookie_fix") == -1)
var url = location.href;
$('#safariRedirectUrl').val(url);
$('#safari-fix-form').submit();
);
iframe 首次加载页面时,如果是 safari 且未设置 cookie,则会发布表单,设置 cookie,并将用户重定向回相同的 url。
【讨论】:
我有非常相似的问题 (***.com/questions/6125741/…),所以如果这对我有帮助,请随时添加您的评论,我会给您赏金。 hm 我用 cookie 和我的 safari 递归添加了表单和操作。 document.cookie.indexOf("safari_cookie_fix") 始终为空。但在开发人员工具下,我看到“cookie ok” 我相当肯定上述方法在 Safari 4.5 中对我有用。不过我最终还是转储了 cookie,因为 IE 中的安全设置也可以阻止第三方 cookie。 我在 safari 5.1.4 下。由于某些原因,我的 cookie 是空的...对于 IE,我添加了 p3p 标头并且它可以工作 很遗憾,这个漏洞似乎已经被堵住了。更多讨论请参见***.com/questions/9930671/…。以上是关于iframe、跨域 cookie、p3p 策略和 safari 错误:未提供所需的防伪令牌或无效的主要内容,如果未能解决你的问题,请参考以下文章