asp.net mvc 2-Iframe、跨域cookie、p3p策略和safari错误:未提供所需的防伪令牌或该令牌无



我之前问过这个问题,发现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"");
}

我不知道这意味着什么,但它不适用于Safari(5)。

此外,当我遇到服务器错误时,所有信息都会在报告中发送给我,包括所有http头。p3p标头在这些错误中从未出现。我不确定这是设计的,还是正在发生的问题的指标。

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

首先,我把这个表格放在我的页面上。事实上,我把它放在了iframe中每个视图都使用的母版页中。

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

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

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。

相关内容

  • 没有找到相关文章

最新更新