web-dev-qa-db-ja.com

IE11でのCORSリクエスト

ログインページから別のURLのアプリケーションサイトに送信されるCORS(クロスオリジンリソース共有)リクエストがあります。ユーザーが既にログインしているかどうかを確認するためにpingを実行する簡単なページがあり、ログインしている場合はリダイレクトします。それ以外の場合は、ログインページを表示します。 jQueryを使用します。

これはサファリ、クロム、Firefoxでうまく機能し、IE(自然)ではありません。MSによれば、IE 10以降は withCredentialsを使用したCORS要求

私はjquery-2.0.3.min.jsを使用しています

IE11でこれが機能しない理由はありますか?

編集:IS部分的に機能しているように見えます。現在は{"id":false}の値を返しているためです。これは毎回発生します。つまり、サーバーは資格情報を取得しません。 。is_logged_inページも投稿していますが、コードイグナイターフレームワークを使用しています。

編集:IEのセキュリティ設定で「ドメイン全体のデータソースを許可する」を有効にした後、エラーメッセージが表示されなくなりました。

私が受け取る正確なエラーは次のとおりです。

SEC7118: http://mysite.net/guest/is_logged_in のXMLHttpRequestには、クロスオリジンリソース共有(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");
    }
}
});

そして

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));

}

前もって感謝します

23
Drew

「ドメイン全体のデータソースにアクセス」の設定を「有効」に変更すると、IEでのクロスドメインチェックが無効になり、恐ろしく安全ではなくなります。代わりに、ターゲットのサードパーティリソースが 有効なP3Pポリシー これは、ユーザーのプライバシーを脅かすものではないことを示します。

18
EricLaw

問題が見つかりました。

同様の問題がありました(特にGWTではなくCORSを一般的に使用しています)。ブラウザーの設定がサードパーティのCookieをブロックしていることが判明しました(IE10>インターネットオプション>プライバシー>詳細設定>サードパーティCookies> Accept)。この問題を解決するために、「自動Cookie処理をオーバーライドする」、「受け入れる」(サードパーティCookie)、および「セッションCookieを常に許可する」をチェックしました。

アンドリューはここでこの質問に答えました: CORSはIE10のCookieでは機能しません

編集:(今、私は何を検索するかを知っています)この問題に他の誰かが遭遇した場合、この質問もいくつかの助けをもたらすかもしれません。 Internet Explorer 10はXMLHttpRequest 'xhr.withCredentials = true'を無視しています

13
Drew

他のすべてのブラウザーを除き、IE11がAccess-Control-Request-Headers: acceptリクエストとともに、「accept」をallowedHeaders cors設定に追加する必要がありました。これは、デフォルトのspring cors設定の一部ではないようだからです。

3
RiZKiT

IE10では、クロスドメインリクエストのCORSヘッダーに加えて、サーバーが有効なP3Pポリシーを返す必要があります。サーバーからP3Pヘッダーを返すためのサンプルphpコードを次に示します。

  $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
3spot

多くの掘り下げの後、ajaxを使用してpingを実行しているページはインターネットゾーンにあり、現在のページはイントラネットゾーンにあることがわかりました。

IE 11では、インターネットサイトで「保護モード」が有効になっており、これが有効になっている場合、Cookieがそのドメインに属していても、pingを実行しているサイトに送信されません。

信頼済みサイトにページを追加するか、「保護モード」を無効にすることで問題が解決しました。

「保護モード」が有効になっている場合でも、両方のサイトがインターネットゾーンにある場合、この問題は発生しないことに注意してください。

0
Fadi

同様の問題があり、axiosもjqueryもInternet Explorerとプリフライト/ CORSの問題で動作しないことがわかりました。古き良きXMLhttpRequestのみが機能しました。純粋なXMLhttpRequestではこれができるためです。

if (xhttp.readyState == 4 && xhttp.status == 200)

AxiosとjqueryはreadyStateではなくステータスを考慮しているようです-彼らはどういうわけかcors問題があると解釈します-そしてIEでreadyState == 4に達するには数ティックかかります。

0
dataplumber