Подтвердить что ты не робот

Iframe, междоменные файлы cookie, политика p3p и сафари с ошибкой: требуемый токен анти-подделки не был указан или был недействителен

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

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

4b9b3361

Ответ 1

Проблема в том, что Safari не позволяет устанавливать cookie в iframe, если пользователь не взаимодействует с этим iframe. Для некоторых это означает щелчок по ссылке. Я нашел лучшее решение, которое должно сделать перенаправление.

Во-первых, я помещаю эту форму на свою страницу. Фактически, я помещал его в главную страницу, которая используется каждым представлением, поданным в iframe.

<% if(SecurityHelper.BrowserIsSafari) { %>
    <% using (Html.BeginForm("SafariRedirect", "Framed", FormMethod.Post, new { id="safari-fix-form" })) { %>
       <%: Html.Hidden("safariRedirectUrl")%>
    <% } %>
<% } %>

Поскольку я только хочу, чтобы это работало, когда пользователь использует сафари, я создал это свойство в статическом вспомогательном классе, чтобы проверить 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);
}

На моей главной странице в заголовке у меня есть мой script, объявленный в том же операторе if, который определяет, отображается ли форма. В моем файле script у меня есть этот 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.