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.
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.
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