Iframe, междоменные файлы cookie, политика p3p и сафари с ошибкой: требуемый токен защиты от подделки не был предоставлен или был недействительным - PullRequest
12 голосов
/ 25 мая 2011

Я задал этот вопрос некоторое время назад и обнаружил, что IE блокирует междоменные куки в iframe, если вы не установили политику p3p . До сих пор исправление p3p прекрасно работало в ie. Однако теперь мы получаем ту же ошибку в сафари.

Я нашел статью с другой политикой 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 никогда не появляется в этих ошибках. Я не уверен, является ли это разработанным или индикатором продолжающейся проблемы.

1 Ответ

9 голосов
/ 26 мая 2011

Проблема в том, что Safari не позволяет устанавливать cookie в iframe, если пользователь не взаимодействует с этим 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 загружает страницу, если это сафари и cookie не установлен, форма публикуется, cookie устанавливается, и пользователь перенаправляется обратно на тот же URL.

...