Как разделить сеанс между несколькими доменами на одном asp.net веб-сайт?

#asp.net #session-cookies #multiple-domains #website-deployment

#asp.net #сеансовые файлы cookie #multiple-domains #веб-сайт-развертывание

Вопрос:

Я хочу разделить cookie сеанса между доменами.

У меня более одного домена: —

 1. mydomain.com
2. mydomain.fr
3. mydomain.de
4. mydomain.da
...and many other language based
  

Теперь у меня есть один веб-сайт, развернутый на сервере. Я хочу разделить сеанс между разными доменами на одном веб-сайте. Как мне этого добиться?

Я нашел в Интернете, <httpCookies domain=".mydomain.com" /> но это работает с поддоменами (такими как test.mydomain.com и secure.mydomain.com ), но не для разных доменов.

Я тоже пытался <httpCookies domain=".mydomain." /> , но к этому сеансу перестал работать.

Кто-нибудь может мне помочь, пожалуйста?

Ответ №1:

Вы не можете обмениваться файлами cookie на доменах, которые имеют другое имя домена верхнего уровня.

Это возможно сделать только с поддоменами.

 mydomain.com
fr.mydomain.com
de.mydomain.com
da.mydomain.com
...
  

Комментарии:

1. Да, это работает. Но есть ли какой-либо возможный способ разделить данные между несколькими доменами?

2. @Waqas — конечно, есть, используя обратные каналы (например, ту же базу данных).

Ответ №2:

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

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

Сеансы Cookieles

Затем вы можете сохранить данные в базе данных или в сеансе InProc на сервере. Как только вы устраните зависимость от файлов cookie.

Редактировать

Кроме того, если вы выполняете какие-либо действия на стороне клиента, используя неавторизованный файл cookie, который абсолютно требует присутствия файлов cookie, вы бы записали их из каждого отдельного домена на основе этих сохраненных на сервере / сеансе значений. Таким образом, пользователь, переключающий домены, в конечном итоге получает ваш cookie для каждого домена.

Комментарии:

1. Сеанс без приготовления создает идентификатор сеанса внутри строки запроса, что невозможно в моем текущем проекте.

Ответ №3:

Вы не можете напрямую передавать файлы cookie между разными доменами. Но есть один способ сделать это возможным в некотором контексте. Вы можете сделать запрос JSONP или загрузить iframe в свой JS. если вы используете iframe, выполните http POST-вызов с помощью form. Тег формы содержит ваше другое доменное имя в качестве действия и имя iframe в качестве цели. Что будет делать форма, так это то, что она загрузит ifram’а, и файл cookie вашего другого домена появится в вашем браузере.

Код:

 <iframe name="iframe-test" border="1px"></iframe>

<form id="iframe-form" target="iframe-test" action="http://differentdomain.com/setCookie" method="POST">
     <input type="hidden" value="1234" name="token">
   </form>

    <script type="text/javascript">
        function submitForm(){          
            var form = document.getElementById("iframe-form");
            form.submit();              
        }
    </script>
  

Ответ №4:

Если вы используете SQL Server, я думаю, вы можете использовать его в качестве поставщика состояния сеанса.

в web.config:

 <sessionState 
        mode="SQLServer"
        sqlConnectionString="data source=127.0.0.1;user id=<username>;password=<strongpassword>"
        cookieless="false" 
        timeout="20" 
/>
  

Вот некоторые документы:

http://msdn.microsoft.com/en-us/library/ms178581.aspx

Комментарии:

1. Да, можно использовать SQLServer, но проблема в том, где мне хранить SessionID?

2. Я думаю, вы можете использовать сеанс. Свойство SessionID.

3. Используя SessionState mode =»SQLServer», объект сеанса будет сохранен на SQLServer, и вы сможете разделить его между доменами.

4. но идентификатор сеанса является частью файла cookie .. sql server — это просто хранилище сеанса на сервере, но вам нужно получить его на основе идентификатора сеанса, отправленного с запросом. Так что это действительно не поможет.