сеанс сервера состояний - кросс-домен приложений? - PullRequest
2 голосов
/ 26 апреля 2010

При использовании сервера состояний для сеансов, сеансы все еще специфичны для appDomain? Так, например, у меня есть два разных приложения IIS (виртуальные каталоги) на веб-сервере, и они оба указывают на один сервер состояний для сеанса. Идентификатор сеанса из файла cookie будет одинаковым для запросов обоих приложений, поэтому будет ли один и тот же сеанс доступен для обоих этих приложений? Спасибо.

Ответы [ 2 ]

2 голосов
/ 14 декабря 2012

Как @ntziolis упомянул в своем ответе, так и @Aristos упомянул в своем комментарии, сеанс основан на комбинации имени приложения и файла cookie сеанса. Вы можете заставить его работать (как я только что сделал), если имя приложения совпадает, а значение cookie сеанса совпадает.

Чтобы имя приложения было таким же, я использовал это решение от SO, использующего отражение:

protected void Application_Start(object sender, EventArgs e)
{
    string applicationName = "MySiteName";

    // Change the Application Name in runtime.
    FieldInfo runtimeInfo = typeof(HttpRuntime).GetField("_theRuntime", BindingFlags.Static | BindingFlags.NonPublic);
    HttpRuntime theRuntime = (HttpRuntime)runtimeInfo.GetValue(null);
    FieldInfo appNameInfo = typeof(HttpRuntime).GetField("_appDomainAppId", BindingFlags.Instance | BindingFlags.NonPublic);

    appNameInfo.SetValue(theRuntime, applicationName);
}

Я добавил это в оба файла Global.asax (каждого из моих сайтов).

Чтобы файл cookie сеанса был таким же, файл cookie не может быть недействительным из-за пути или домена. Если у вас есть два виртуальных каталога на одном и том же сайте, вы можете решить проблему пути и домена cookie.

Если вы не добавили явный код в файл web.config, по умолчанию имя файла cookie сеанса и ключ компьютера также будут одинаковыми. Если нет, вам нужно убедиться, что ваш <machineKey> явно установлен и одинаков для двух приложений, а значение для cookieName в <sessionState> явно установлено и одинаково для двух приложений:

<configuration>
  <system.web>
    <machineKey validationKey="77D2713C3E6C46160F278B7F4787A341A8E9010C3C228F8E9522685050F5204ECA0F2BA2169C4F29C1ADD8C3B99E7143A21272A59373BFBEF21C6677D0FF293C" decryptionKey="286F0EA94D5DA2E697C8C148934EF885A6513AD91C044EDFE7DC45027653B830" validation="SHA1" decryption="AES" />
    <sessionState cookieName="mySessionCookie" mode="StateServer" stateConnectionString="tcpip=127.0.0.1:42424" cookieless="false" timeout="20" />
  </system.web>
</configuration>

Это сработало для меня - мне удалось раскрутить веб-сайт для проверки концепции.

0 голосов
/ 26 апреля 2010

Проблема не в домене приложения, а в имени приложения (в файле web.config). Пока имя приложения совпадает, вы можете поделиться состоянием сеанса.

Для различных имен приложений отметьте здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...