Asp.net-Mvc-2
iframe、跨域 cookie、p3p 策略和 safari 錯誤:未提供所需的防偽令牌或無效
不久前我問了這個問題,發現 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。