Междоменный доступ к файлам cookie (или сеанс) - PullRequest
11 голосов
/ 02 июня 2009

Хотя я понимаю, что это обычно связано с атаками с использованием межсайтовых сценариев, меня интересует, как сеанс может оставаться действительным на нескольких поддоменах, принадлежащих одному домену (например, пользователь входит в систему только один раз и для доступа к subdomain1.domain.com и subdomain2.domain.com с одним и тем же сеансом). Полагаю, мне сначала нужно понять, как это работает, но до сих пор я не смог найти ничего, что имело бы какое-либо значение.

Но опять же, может быть, я не задавал правильный вопрос.

Заранее спасибо:)

Ответы [ 7 ]

18 голосов
/ 02 июня 2009

Сеансы Inproc не могут оставаться действительными, однако вы можете кодировать свое веб-приложение, чтобы разрешить использование файлов cookie для нескольких поддоменов. Вам нужно будет установить домен равным:

Response.Cookies("CookieName").Domain = ".mydomain.com"

Запомните период.

6 голосов
/ 02 июня 2009

Существует несколько способов обмена данными сеанса или файлами cookie между доменами. Самое простое - поделиться им на стороне сервера через общее хранилище данных. Но вы бы не задавали этот вопрос, если бы это было так просто.

Другой способ сделать это одинаково прост. Домен one.com содержит некоторые данные сеанса, например, name=aleem и id=123, и желает передать их в two.com. Он будет следовать следующим шагам:

  1. Позвонить на two.com/api/?name=aleem&id=123
  2. Когда two.com получает данные через параметры запроса, он создает файл cookie с данными. Этот файл cookie будет храниться в домене two.com.
  3. two.com затем перенаправит обратно на REFERER, который в данном случае будет one.com

Это упрощенный сценарий. Домен two.com должен быть в состоянии доверять one.com, и не только этому, но и знать, что запрос является подлинным, а не просто обработанным пользователем, поэтому вам нужно использовать открытый / закрытый ключи для смягчения этого. *

2 голосов
/ 02 июня 2009

По умолчанию все файлы cookie для сайта хранятся вместе на клиенте, и все файлы cookie отправляются на сервер с любым запросом к этому сайту. Другими словами, каждая страница сайта получает все файлы cookie для этого сайта. Однако вы можете установить область действия файлов cookie двумя способами:

  1. Ограничьте область использования файлов cookie папкой на сервере, что позволяет ограничить использование файлов cookie приложением на сайте.
  2. Установить область для домена, что позволяет указать, какие субдомены в домене могут получить доступ к cookie.

Вы можете узнать больше здесь .

1 голос
/ 02 июня 2009

Если у вас есть возможность настроить общий поддомен, вы можете сделать это:

В html-файлах вашего субдомена вверху включите файл javascript, например:

<script src="http: //common.domain.com/check.asp"></script>

В файле check.asp найдите файл cookie logged_in и, если его нет, покажите страницу, на которой написано http://common.domain.com/login.asp, используя что-то вроде

<%
if (cookie_not_found){
%>
location.href = "http: //common.domain.com/login.asp";
<%
}
%>

После того, как человек отправит пароль пользователя, отправьте его обратно на тот же логин login.asp и установите cookie сеанса (который будет установлен в домене common.domain.com), а затем перенаправьте на http://subdomain1.domain.com.

Что произойдет сейчас, так это то, что будет сделан вызов встроенному «common.domain.com/check.asp», и файлы cookie для common.domain.com будут отправлены браузером вместе с запросом. Таким образом, вы будете знать, действителен ли ваш сеанс или нет, даже если вы находитесь на subdomain1.domain.com.

1 голос
/ 02 июня 2009

Комментарии о том, что cookie настроен для домена, чтобы позволить поддоменам получать этот cookie, дают вам эту сторону, но не хватает последовательности сеанса.

Я думаю, что это очень похоже на проблему поддержания состояния между серверами в ферме, и решение, вероятно, состоит в том, чтобы гарантировать, что ваше хранилище сеансов одинаково для обоих сайтов (если они не являются серверами одного и того же «веб-сайта» в IIS). Вы можете переместить хранилище сеансов в SQL Server ( КАК: настроить SQL Server для хранения состояния сеанса ASP.NET ), что, вероятно, послужит цели, поскольку каждый сайт будет запрашивать одно и то же хранилище при поиске данных сеанса связанные с файлом cookie, с которым они были представлены.

Я надеюсь, что вы попадете на правильный путь.

0 голосов
/ 18 февраля 2010

Вот решение, которое работает:

http://anantgarg.com/2010/02/18/cross-domain-cookies-in-safari/

0 голосов
/ 02 июня 2009

Вы можете установить cookie для определенного домена.

В php метод setCookie () содержит параметр, в котором вы можете указать домен верхнего уровня, поэтому файл cookie действителен для всех поддоменов. Судя по вашим тегам, я вижу, что вы работаете в asp.net. Вероятно, это также существует для аспи ...

после небольшого поиска asp:

попробуйте это:

Response.Cookies("CookieName").Domain = ".mydomain.com"

или прочитайте это

...