iframe,跨域cookie,p3p策略和safari出现错误:未提供必需的防伪令牌或该令牌无效

问题描述

| 不久前,我问了这个问题,发现除非您设置p3p策略,否则IE会阻止iframe中的跨域Cookie。到目前为止,p3p修复在ie中运行良好。但是,现在我们在野生动物园中遇到了相同的错误。 我发现了一篇关于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标头永远不会出现这些错误。我不确定这是设计使然还是该问题继续存在的指示。     

解决方法

问题是,除非用户与该iframe进行交互,否则Safari不允许在iframe中设置Cookie。对于某些人来说,这意味着单击链接。我找到了一个更好的解决方案,那就是重定向。 首先,我将此表格放在页面上。实际上,我将其放在iframe中服务的每个视图所使用的母版页中。
<% if(SecurityHelper.BrowserIsSafari) { %>
    <% using (Html.BeginForm(\"SafariRedirect\",\"Framed\",FormMethod.Post,new { id=\"safari-fix-form\" })) { %>
       <%: Html.Hidden(\"safariRedirectUrl\")%>
    <% } %>
<% } %>
因为我只希望此功能在用户使用野生动物园时起作用,所以我在静态帮助器类中创建了此属性以检查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被设置,并且用户将被重定向回相同的网址。     

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...