ログインページから別の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));
}
前もって感謝します
「ドメイン全体のデータソースにアクセス」の設定を「有効」に変更すると、IEでのクロスドメインチェックが無効になり、恐ろしく安全ではなくなります。代わりに、ターゲットのサードパーティリソースが 有効なP3Pポリシー これは、ユーザーのプライバシーを脅かすものではないことを示します。
問題が見つかりました。
同様の問題がありました(特にGWTではなくCORSを一般的に使用しています)。ブラウザーの設定がサードパーティのCookieをブロックしていることが判明しました(IE10>インターネットオプション>プライバシー>詳細設定>サードパーティCookies> Accept)。この問題を解決するために、「自動Cookie処理をオーバーライドする」、「受け入れる」(サードパーティCookie)、および「セッションCookieを常に許可する」をチェックしました。
アンドリューはここでこの質問に答えました: CORSはIE10のCookieでは機能しません
編集:(今、私は何を検索するかを知っています)この問題に他の誰かが遭遇した場合、この質問もいくつかの助けをもたらすかもしれません。 Internet Explorer 10はXMLHttpRequest 'xhr.withCredentials = true'を無視しています
他のすべてのブラウザーを除き、IE11がAccess-Control-Request-Headers: accept
リクエストとともに、「accept」をallowedHeaders cors設定に追加する必要がありました。これは、デフォルトのspring cors設定の一部ではないようだからです。
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\"");
}
多くの掘り下げの後、ajaxを使用してpingを実行しているページはインターネットゾーンにあり、現在のページはイントラネットゾーンにあることがわかりました。
IE 11では、インターネットサイトで「保護モード」が有効になっており、これが有効になっている場合、Cookieがそのドメインに属していても、pingを実行しているサイトに送信されません。
信頼済みサイトにページを追加するか、「保護モード」を無効にすることで問題が解決しました。
「保護モード」が有効になっている場合でも、両方のサイトがインターネットゾーンにある場合、この問題は発生しないことに注意してください。
同様の問題があり、axiosもjqueryもInternet Explorerとプリフライト/ CORSの問題で動作しないことがわかりました。古き良きXMLhttpRequestのみが機能しました。純粋なXMLhttpRequestではこれができるためです。
if (xhttp.readyState == 4 && xhttp.status == 200)
AxiosとjqueryはreadyStateではなくステータスを考慮しているようです-彼らはどういうわけかcors問題があると解釈します-そしてIEでreadyState == 4に達するには数ティックかかります。