Iframe, pliki cookie między domenami, Zasady p3p i safari z błędem: wymagany token zapobiegający fałszowaniu nie został dostarczony lub był nieprawidłowy

Zadałem to pytanie jakiś czas temu i stwierdziłem, że IE blokuje pliki cookie między domenami w ramce iframe, chyba że ustawisz politykę p3p. Do tej pory poprawka p3p działała pięknie w ie. Jednak teraz otrzymujemy ten sam błąd w safari.

Znalazłem artykuł z inną Polityką p3p dla safari. Dodałem ten kod, aby skonfigurować zasady p3p, ale nadal otrzymuję błąd tokena weryfikacji żądania.

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\"");
}
Nie wiem, co to znaczy., ale nie działa na Safari (5).

Również, gdy pojawia się błąd serwera, wszystkie informacje są wysyłane do mnie w raporcie, w tym wszystkie nagłówki http. Nagłówek p3p nigdy nie pojawia się w tych błędach. Nie jestem pewien, czy jest to z założenia, czy jest to wskaźnik problemu dzieje.

Author: Community, 2011-05-25

1 answers

Problem polega na tym, że Safari nie pozwala na ustawienie pliku cookie w ramce iframe, chyba że użytkownik wchodzi w interakcję z tym ramką iframe. Dla niektórych oznacza to kliknięcie linku. Znalazłem lepsze rozwiązanie, czyli zrobić przekierowanie.

Najpierw umieściłem ten formularz na mojej stronie. W rzeczywistości umieściłem go na stronie głównej, która jest używana przez każdy widok serwowany w ramce iframe.

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

Ponieważ chcę, aby to działało tylko wtedy, gdy użytkownik używa safari, utworzyłem tę właściwość w statycznej klasie pomocniczej, aby sprawdzić useragent

public static bool BrowserIsSafari
{
    get { return HttpContext.Current.Request.UserAgent.ToLower().IndexOf("safari") >= 0; }
}

Następnie w moim kontrolerze mam następującą akcję

[HttpPost]
public ActionResult SafariRedirect(string safariRedirectUrl)
{
    Response.Cookies.Add(new HttpCookie("safari_cookie_fix", "cookie ok"));

    return Redirect(safariRedirectUrl);
}

Na mojej stronie głównej, w nagłówku, mam mój skrypt zadeklarowany w tej samej instrukcji if, która określa, czy formularz jest renderowany. W moim pliku skryptu, mam ten jquery

$(function () {

    if ($.browser.safari == true && document.cookie.indexOf("safari_cookie_fix") == -1) {
        var url = location.href;

        $('#safariRedirectUrl').val(url);
        $('#safari-fix-form').submit();
    }

});

Gdy ramka iframe ładuje stronę po raz pierwszy, jeśli jest to safari i plik cookie nie jest ustawiony, formularz jest publikowany, plik cookie jest ustawiony, a użytkownik jest przekierowywany z powrotem do tego samego adresu url.

 8
Author: Captain Cosmodrome,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-26 13:53:23