我之前问过这个问题,发现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。