Pytanie Prośba CORS z IE11


Mam zgłoszenie CORS (współdzielenie zasobów początkowych) pochodzące z mojej strony logowania do strony aplikacji pod innym adresem URL. Mam proste strony ping, aby określić, czy użytkownik jest już zalogowany, a jeśli tak, przekierowuje je. W przeciwnym razie wyświetlam stronę logowania. Używam jQuery.

Działa to świetnie w safari, chrome, firefox ... a nie IE (naturalnie). Według MS, IE 10 i późniejsze powinny wspierać Żądania CORS za pomocą funkcjiKredencje

Używam jquery-2.0.3.min.js

Jakieś pomysły, dlaczego to nie działa w IE11?

EDYCJA: Wygląda na to, że działa częściowo, ponieważ obecnie zwraca wartość {"id": false}. Dzieje się tak za każdym razem, co oznacza, że ​​serwer nigdy nie otrzymuje poświadczeń. Publikuję również moją stronę is_logged_in, używam framework'a do łamania kodu.

EDYCJA: Po włączeniu opcji "Zezwalaj na źródła danych w domenach" w ustawieniach zabezpieczeń IE, nie otrzymuję już żadnych komunikatów o błędach.

Dokładny błąd jaki otrzymuję to:

SEC7118: XMLHttpRequest dla http://mysite.net/guest/is_logged_in wymagane Cross Resource Resource Sharing (CORS).

$.ajax({
url: 'http://mysite.net/guest/is_logged_in',
type: 'POST',
crossDomain: true,
xhrFields: {
       withCredentials: true
  },

dataType: 'json',
success: function(data) {

    if(data.id) {
        window.location.replace("http://mysite.net");
    }
}
});

i

public function is_logged_in()
{
    $allowed = array(
        'http://mysite.net',
        'http://www.mysite.net',
        'http://www.mysite.com',
    );

    $url = $_SERVER['HTTP_REFERER'];
    $url = substr($url, 0, strpos($url, '/', 8));
    if(isset($_SERVER['HTTP_ORIGIN']))
    {
        if(in_array($_SERVER['HTTP_ORIGIN'], $allowed))
        {
            $this->output->set_header('Access-Control-Allow-Origin: ' . $_SERVER['HTTP_ORIGIN']);
        }
    }
    else
    {
        if(in_array($url, $allowed))
        {
            $this->output->set_header('Access-Control-Allow-Origin: ' . $url);
        }
    }


    $this->output->set_header('Access-Control-Allow-Headers: X-Requested-With');
    $this->output->set_header('Access-Control-Allow-Credentials: true');
    $this->output->set_header("Access-Control-Expose-Headers: Access-Control-Allow-Origin");


    //TODO: Try to detect if this is an ajax request, and disallow it if not.

    $data = new stdClass();
    $this->load->library("ion_auth");
    if($this->ion_auth->logged_in())
    {
        $data->name = $this->ion_auth->user()->row()->first_name;
        $data->id = $this->ion_auth->get_user_id();
    } else {
        $data->id = false;
    }

    $this->output->set_output(json_encode($data));

}

Z góry dziękuję


21
2017-11-25 16:54


pochodzenie


Czy masz jakieś ustawienie "Różne -> Dostęp do źródeł danych w różnych domenach" w swoim Internecie -> Opcje zabezpieczeń są wyłączone? - eithed
Fakt, że przekierowujecie sukces, sprawia, że ​​zastanawiam się, czy w ogóle potrzebujecie do tego ajaxu. - Kevin B
W rzeczywistości został ustawiony jako "wyłączony". Włączyłem go i nadal nie działa, ale teraz też nie ma błędu. - Drew
czy może masz starszą wersję tego js (zanim dodałeś ustawienie "withCredentials") w pamięci podręcznej IE (IE uwielbia pamięć podręczną.) Kocha to)? Po prostu zgaduję. IE uwielbia buforować dane z żądań ajaxowych. Upewnij się, że używasz czegoś takiego jak: $ .ajaxSetup ({cache: false}). - James Adam
Fakt, że nie daje już błędu, mówi, że ajax się powiódł (lub przynajmniej że serwer odpowiedział i skrypt miał poświadczenia, aby kontynuować). Jaka jest odpowiedź wysyłana przez serwer? edytuj: może to jest location.replace rzecz? Najpierw sprawdź, czy kod trafia do bloku sukcesu tylko za pomocą window.alert(data) - eithed


Odpowiedzi:


Zmiana ustawienia "Dostęp do źródeł danych w różnych domenach" na Włączony powoduje wyłączenie sprawdzeń między domenami w IE i jest przerażająco niebezpieczna. Zamiast tego musisz upewnić się, że docelowy zasób zewnętrzny wysyła a aktualna polityka P3P to wskazuje, że nie robi nic strasznego prywatność użytkownika.


17
2018-02-10 16:39



Zajrzałem do P3P, ale zdecydowałem, że nie jest tak naprawdę używane. Z Wikipedii> P3P został opracowany przez World Wide Web Consortium (W3C) i oficjalnie rekomendowany 16 kwietnia 2002. Rozwój wkrótce przestał istnieć i było bardzo mało implementacji P3P. Microsoft Internet Explorer jest jedyną główną przeglądarką obsługującą P3P - Drew
Ty: "Dlaczego mój kod nie działa w IE?" Ja: "Ponieważ IE wymaga P3P." Ty: "Ale P3P tak naprawdę nie jest używany, z wyjątkiem IE." Ja: "..." - EricLaw
To bardzo elegancki sposób na przedstawienie mojej postawy (: Tak, gdyby to była bardziej krytyczna cecha, wprowadziłbym politykę P3P, dam ci odpowiedź, bo jesteś technicznie poprawny, i to jest najlepszy rodzaj poprawny. - Drew
Dodałem P3P w nagłówku odpowiedzi, ale wciąż nie mam wyjścia. Mogę zmienić tylko "Dostęp do źródeł danych w różnych domenach", aby umożliwić działanie! - kiford
Próbowałem też dodać nagłówek P3P w odpowiedzi i to nie pomogło. - termit


Znaleziono problem.

Miałem podobny problem (w ogóle używając CORS, a nie konkretnie GWT).   Okazało się, że ustawienia przeglądarki blokują strony trzecie   pliki cookie (IE10> Opcje internetowe> Prywatność> Zaawansowane> Zewnętrzne   Pliki cookie> Zaakceptuj). Aby rozwiązać problem, zaznaczyłem "Zastąp automatyczny   obsługa plików cookie "," Zaakceptuj "(pliki cookie innych firm) i" Zawsze zezwalaj   sesyjne pliki cookie. "

Andrew odpowiedział na to pytanie tutaj: CORS nie działa z plikami cookie w IE10

EDYCJA: (Teraz, gdy wiem, co szukać) To pytanie może również pomóc, jeśli ktoś inny wpadnie na ten problem. Internet Explorer 10 ignoruje XMLHttpRequest "xhr.withCredentials = true"


10
2017-12-02 14:19



To naprawiło podobny problem dla mnie. - ianbeks


IE10 wymaga od serwera przesłania prawidłowych zasad P3P oprócz nagłówków CORS dla żądań międzydomenowych. Oto przykładowy kod php do zwracania nagłówka P3P z serwera.

  $szOrigin = $_SERVER['HTTP_ORIGIN'];
  if ($szOrigin != null)
  {
        header("Access-Control-Allow-Origin: $szOrigin");
        header("Access-Control-Allow-Credentials: true");
        header("P3P: CP=\"ALL IND DSP COR ADM CONo CUR CUSo IVAo IVDo PSA PSD TAI TELo OUR SAMo CNT COM INT NAV ONL PHY PRE PUR UNI\"");
  }

0
2018-06-15 15:40





Po wielu kopaniu znalazłem, że strona, którą pinguję używając ajaxa, znajduje się w strefie internetowej, podczas gdy moja obecna strona znajduje się w strefie intranetowej.

IE 11 ma włączoną opcję "Tryb chroniony" dla stron internetowych, a gdy jest włączona, pliki cookie nie są wysyłane do witryny, której pinguję, nawet jeśli należą do tej domeny.

Dodanie strony do zaufanych stron lub wyłączenie "trybu chronionego" rozwiązało problem.

Pamiętaj, że ten problem nie występuje, gdy obie witryny znajdują się w strefie internetowej, nawet jeśli włączony jest tryb chroniony.


0
2017-09-06 12:32





Mieliśmy problem z wysłaniem IE11, z wyjątkiem każdej innej przeglądarki Access-Control-Request-Headers: acceptwraz z żądaniem, więc "accept" musi zostać dodane do konfiguracji cents allowedHeaders, ponieważ wydaje się nie być częścią domyślnej konfiguracji cors spring.


0
2018-06-29 08:28