12

不久前我问了这个问题,发现 IE 会阻止 iframe 中的跨域 cookie,除非你设置了p3p policy。到目前为止,p3p 修复在 ie 中运行良好。但是,现在我们在 Safari 中遇到了同样的错误。

我发现一篇关于 safari的p3p 政策不同的文章。我添加了此代码来设置 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 标头永远不会出现在这些错误中。我不确定这是设计使然,还是表明问题正在发生。

4

1 回答 1

9

问题是 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。

于 2011-05-26T13:53:23.287 回答