iframe,跨域cookie,p3p策略和带有错误的safari:未提供所需的防伪令牌或无效

Jos*_*osh 12 cookies safari cross-domain p3p asp.net-mvc-2

我不久前问了这个问题,发现IE阻止了iframe中的跨域cookie,除非你设置了p3p策略.到目前为止,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\"");
}
Run Code Online (Sandbox Code Playgroud)

我不确定这是什么意思,但它不适用于Safari(5).

此外,当我收到服务器错误时,所有信息都会在报告中发送给我,包括所有http标头.p3p标头永远不会出现在这些错误中.我不确定这是否是设计或是否是问题的指标.

Jos*_*osh 9

问题是Safari不允许在iframe中设置cookie,除非用户与该iframe交互.对于某些人来说,这意味着点击链接.我找到了一个更好的解决方案,即进行重定向.

首先,我把这个表格放在我的页面上.实际上,我把它放在iframe中提供的每个视图使用的母版页中.

<% if(SecurityHelper.BrowserIsSafari) { %>
    <% using (Html.BeginForm("SafariRedirect", "Framed", FormMethod.Post, new { id="safari-fix-form" })) { %>
       <%: Html.Hidden("safariRedirectUrl")%>
    <% } %>
<% } %>
Run Code Online (Sandbox Code Playgroud)

因为我只想在用户使用safari时才能使用它,所以我在静态助手类中创建了这个属性来检查useragent

public static bool BrowserIsSafari
{
    get { return HttpContext.Current.Request.UserAgent.ToLower().IndexOf("safari") >= 0; }
}
Run Code Online (Sandbox Code Playgroud)

然后,在我的控制器中,我有以下操作

[HttpPost]
public ActionResult SafariRedirect(string safariRedirectUrl)
{
    Response.Cookies.Add(new HttpCookie("safari_cookie_fix", "cookie ok"));

    return Redirect(safariRedirectUrl);
}
Run Code Online (Sandbox Code Playgroud)

在我的母版页中,在标题中,我在同一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();
    }

});
Run Code Online (Sandbox Code Playgroud)

iframe第一次加载页面时,如果它是safari并且未设置cookie,则会发布表单,设置cookie,并将用户重定向回相同的URL.