【问题标题】:Iframe, cross-domain cookies, p3p policy, and safari with error: A required anti-forgery token was not supplied or was invalidiframe、跨域 cookie、p3p 策略和 safari 错误:未提供所需的防伪令牌或无效
【发布时间】: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 标头永远不会出现在这些错误中。我不确定这是设计使然,还是表明问题正在发生。

【问题讨论】:

    标签: asp.net-mvc-2 cookies safari cross-domain 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。

    【讨论】:

    • 我有非常相似的问题 (stackoverflow.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 标头并且它可以工作
    • 很遗憾,这个漏洞似乎已经被堵住了。更多讨论请参见stackoverflow.com/questions/9930671/…
    猜你喜欢
    • 2013-01-27
    • 2014-03-07
    • 2012-01-25
    • 1970-01-01
    • 2012-06-09
    • 1970-01-01
    • 2011-02-16
    • 2012-02-19
    相关资源
    最近更新 更多