Сохранение файла cookie сеанса для групп поддоменов в ASP.NET IIS7 - PullRequest
0 голосов
/ 06 января 2011

У меня есть приложение под управлением ASP.NET. У меня разные домены и разные поддомены. Я хочу, чтобы домены совместно использовали сессию со своими поддоменами.

Например, следующие домены имеют доступ к этому приложению:
www.example1.com
print.example1.com
www.example2.com
print.example2.com

Если пользователь заходит на www.example1.com и print.example1.com, я хочу, чтобы он использовал тот же сеанс. Если бы пользователь пошел на www.example2.com и print.example2.com, я бы хотел, чтобы он использовал сеанс, отличный от * .example1.com.

То, как я привык к этому, было взломом page_load, который отлично работает в IIS6:
Response.Cookies ["ASP.NET_SessionId"]. Значение = Session.SessionID;
Response.Cookies ["ASP.NET_SessionId"]. Domain = SiteUtility.GetCookieDomain ();
(SiteUtility.GetCookieDomain возвращает .example1.com или .example2.com в зависимости от URL-адреса запроса)

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

Затем я нашел запись web.config:
'.

Это прекрасно подходит для совместного использования файлов cookie сеанса между поддоменами example1.com. К сожалению, это полностью портит состояние сеанса для * .example2.com.

Есть идеи, как мне это решить?

Ответы [ 3 ]

0 голосов
/ 06 января 2011

вместо использования SiteUtility.GetCookieDomain (), попробуйте использовать:

var domainSansTLD = Request.Url.Host.Replace(".com", "");
var secondLevelDomain = domainSansTLD.Substring(domainSansTLD.LastIndexOf('.'));
var cookieDomain = secondLevelDomain + ".com";
0 голосов
/ 06 января 2011

Первый путь,

Сохранять сеанс в виде файла в месте, к которому могут иметь доступ оба сервера (это хорошо для виртуальных серверов или общих папок). Этот метод немного ненадежен, общие папки и лаги вызывают проблемы.

Хорошо, я собирался написать пару других методов, но я уверен, что они будут опубликованы, так как они имеют больше знаний о asp.net, чем я, однако у меня есть личные предпочтения, которые, я думаю, будут хороший вариант.

Эта опция будет сервером memcache. По сути, это база данных, которая работает из ОЗУ, и вы указываете на нее все свои сеансы (tcp: //mem.domain.com: 1234 ... извините, я не могу вспомнить обычный порт на моей голове).

Надеюсь, я чем-то помог,

Jon

0 голосов
/ 06 января 2011

Вы пытались создать HttpModule, который перехватывает событие EndRequest, выполняет итерацию по коллекции Response.Cookies, находит сеанс cooke и изменяет его свойство Domain перед его фактической отправкой клиенту.

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

В конце Кевин определил, что один из поддоменов находился в доверенном состоянии в ie8, а другой - нет.Когда оба находятся в доверенном состоянии (и presumambly оба в ненадежном состоянии), это работает.Я потратил на это больше всего времени, поэтому Кевин хочет отдать мне должное за ответ.

...