簡體   English   中英

使用IE11的CORS請求

[英]CORS request with IE11

我有一個CORS(跨源資源共享)請求從我的登錄頁面到應用程序站點,在不同的URL上。 我有一個簡單的頁面我ping以確定用戶是否已經登錄,如果是,則重定向它們。 否則我會顯示一個登錄頁面。 我使用jQuery。

這適用於safari,chrome,firefox ......而不是IE(自然)。 根據MS,IE 10及更高版本應該使用withCredentials支持CORS請求

我正在使用jquery-2.0.3.min.js

任何想法為什么這不適用於IE11?

編輯:它似乎部分工作,因為它現在返回值{“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策略 ,該策略指示它不會對用戶的隱私做出可怕的事情。

發現了這個問題。

我遇到了類似的問題(一般使用CORS,而不是GWT)。 事實證明,瀏覽器設置阻止了第三方cookie(IE10> Internet選項>隱私>高級>第三方Cookie>接受)。 為了解決這個問題,我檢查了“覆蓋自動cookie處理”,“接受”(第三方Cookie)和“始終允許會話cookie”。

Andrew在這里回答了這個問題: CORS在IE10中不適用於cookie

編輯:(現在我知道要搜索什么)這個問題可能會產生一些幫助,如果其他人遇到這個問題。 Internet Explorer 10忽略XMLHttpRequest'xhr.withCredentials = true'

我們遇到的問題是,除了所有其他瀏覽器之外,IE11發送Access-Control-Request-Headers: accept請求,因此必須將“accept”添加到allowedHeaders cors配置中,因為它似乎不屬於默認彈簧cors配置。

IE10要求服務器返回有效的P3P策略以及用於跨域請求的CORS頭。 這是用於從服務器返回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的頁面在Internet區域,而我的當前頁面在Intranet區域。

IE 11為互聯網站點啟用了“保護模式”,當啟用此功能時,即使cookie屬於該域,也不會將cookie發送到我正在ping的站點。

將頁面添加到受信任的站點,或禁用“保護模式”解決了這個問題。

請注意,即使啟用了“保護模式”,當兩個站點都在Internet區域時也不會發生此問題。

我有類似的問題,發現無論是axios還是jquery都無法使用Internet Explorer和預檢/ CORS問題。 只有好舊的XMLhttpRequest才有效。 因為在純XMLhttpRequest中我們可以這樣做:

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

似乎axios和jquery考慮了狀態而不是readyState - 它們以某種方式解釋存在cors問題 - 並且在IE中需要幾個滴答來達到readyState == 4。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM