Asp.net-Mvc-2

iframe、跨域 cookie、p3p 策略和 safari 錯誤:未提供所需的防偽令牌或無效

  • May 26, 2011

不久前我問了這個問題,發現 IE 會阻止 iframe 中的跨域 cookie,除非你設置了p3p policy。到目前為止,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 時工作,所以我在靜態幫助程序類中創建了這個屬性來檢查使用者代理

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。

引用自:https://stackoverflow.com/questions/6125741