Вы должны правильно реализовать запросы CORS с учетными данными для отправки и получения файлов cookie через Ajax. См. developer.mozilla.org , в частности в разделе «Запросы с учетными данными».
Прежде всего, вот простой запрос CORS Ajax с учетными данными, используя jQuery 1.5.1 +:
$.ajax({
url: "http://www.domain2.com/process",
xhrFields: {
withCredentials: true
}
}).done(function (data) { console.log(data); });
Обратите внимание на флаг withCredentials
в полях xhrFields. Этот флаг указывает браузеру отправлять файлы cookie с запросом на внешний домен , а не на домен origin . В вашем случае файлы cookie для www.domain2.com будут отправлены, и вы получите доступ к ним на стороне сервера.
На стороне сервера вам нужно добавить в ответ определенные заголовки:
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: www.domain1.com
Важное замечание: запросы с учетными данными не могут установить глобальный заголовок Access-Control-Allow-Origin (Access-Control-Allow-Origin: *
). Необходимо указать домены (Access-Control-Allow-Origin: www.domain1.com
).
Очевидно, что лучше указать домен для заголовка Access-Control-Allow-Origin . Но если вы не знаете или не знаете, откуда поступает запрос CORS, вы можете использовать заголовок Origin
из запроса и просто установить заголовок Access-Control-Allow-Origin вашего ответа на тот. В C # вот как мы это сделали:
this.Response.AddHeader("Access-Control-Allow-Origin", this.Request.Headers["Origin"]);
После всего этого куки, которые вы установили на стороне сервера, будут отправлены обратно с ответом, и браузер сможет правильно обработать их и вставить в хранилище куки браузера для www.domain2. ком . И любые последующие запросы CORS, которые вы отправляете, также будут отправлять эти файлы cookie в запросе.
Если вы отправляете запрос, отличный от методов GET, POST или HEAD, вам необходимо реализовать Предварительно просвеченные запросы (см. Раздел «Предварительно просвеченные запросы») :
В отличие от простых запросов (описанных выше), «предварительно проверенные» запросы сначала отправляют HTTP-запрос методом OPTIONS на ресурс в другом домене, чтобы определить, безопасен ли фактический запрос для отправки. Межсайтовые запросы предварительно просматриваются следующим образом, поскольку они могут иметь значение для пользовательских данных. В частности, запрос предварительно просвечивается, если:
Используются методы, отличные от GET, HEAD или POST. Кроме того, если POST используется для отправки данных запроса с Content-Type, отличным от application / x-www-form-urlencoded, multipart / form-data или text / plain, например, если запрос POST отправляет полезную нагрузку XML на сервер с помощью application / xml или text / xml, то запрос предварительно просвечивается.
Устанавливает пользовательские заголовки в запросе (например, запрос использует заголовок, такой как X-PINGOTHER)
Примечание по поводу IE8 и IE9:
Вызов Ajax выше не будет работать в IE8 и 9. Я включил JS-файл из MoonScript / jQuery-ajaxTransport-XDomainRequest на мою страницу, и это автоматически позволило CORS-запросам работать в этих старых версиях IE. Но, к сожалению, объект XDomainRequest, созданный MS для IE8 и 9, не позволяет отправлять или получать файлы cookie. (см. это сообщение в блоге MSDN для получения дополнительной информации)