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标头永远不会出现在这些错误中.我不确定这是否是设计或是否是问题的指标.
问题是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.
归档时间: |
|
查看次数: |
13950 次 |
最近记录: |