Подтвердить что ты не робот

Совместная сессия между двумя веб-сайтами с использованием asp.net и государственного сервера

У меня есть два точно таких же веб-сайта, размещенных на двух разных машинах в IIS 7.5. На моем компьютере запущена государственная служба ASP.NET, а web.config обновляется на обоих сайтах с помощью следующего кода:

<sessionState mode="StateServer" stateConnectionString="tcpip=192.168.1.77:42424" cookieless="false" timeout="120"/>

Разрешить удаленное подключение установлено в 1 в реестре, чтобы второй веб-сайт мог получить доступ к государственному серверу.

Оба веб-сайта имеют один и тот же машинный ключ:

<machineKey validationKey="7CB8DF6872FB6B35DECD3A8F55582350FEE1FAB9BE6B930216056C1B5BA69A4C5777B3125A42C4AECB4419D43EC12F168FD1BB887469798093C3CAA2427B2B89" decryptionKey="02FC52E4C71544868EE297826A613C53537DF8FDAF93FA2C64E9A5EF0BA467FB" validation="SHA1" decryption="AES" />

Кроме того, оба сайта настроены в IIS с тем же идентификатором.

Что я хочу сделать, так это то, что оба этих сайта используют одни и те же данные сеанса, например, в состоянии сделать следующее:

// At web site 1: 
Session["key"] = "value"

и

// At web site 2:
// Read session value from the other web site
string result = Session["key"]

Проблема в том, что я не могу выполнить этот тест и действительно не могу понять, что я делаю неправильно.

Любая идея, которая может помочь?

4b9b3361

Ответ 1

Вам понадобится способ убедить ваш браузер отправлять один и тот же cookie сессии ASP.NET независимо от того, какой сайт он посещает.

Если файл cookie отсутствует в запросе, новый сеанс будет создан с этим ключом.

Я думаю, вы можете заставить браузер сохранить ключ с некоторыми скрытыми настройками DNS - если вы присвойте http://website1.mydomain.com/ и http://website2.domain.com/, чтобы быть адресами ваших сайтов, затем установите для домена cookie сеанса ASP.NET значение "domain.com", тогда ваш браузер будет отправьте его на оба сайта, и сеанс должен быть общим.

Вы также можете использовать режим cookieless с ASP.NET и получить идентификатор сеанса из сгенерированных URL-адресов.

Ответ 2

Я знаю, что на этот вопрос был дан ответ 5 лет назад, но сегодня я думаю, что могу добавить в него дополнительную информацию.

Во-первых, это не официальный способ обмена данными сеанса между двумя приложениями IIS или самым популярным способом. "По-видимому, официальный" способ - использовать сеанс SQL Server.

В случае, если вы не можете использовать SQL-сервер по какой-либо причине, мы можем немного настроить приложения IIS, чтобы мы могли использовать сеанс вне процесса, также как режим состояния StateServer.

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

  • Сессия cookie из 2-х приложений должна быть установлена ​​с одинаковым доменным именем. Например.
<httpCookies domain=".your.site"/>
  1. Ключ машины должен быть согласован. Вы можете сделать стандартное шифрование полей Web.config, чтобы сделать его более безопасным, но это необязательно.
<machineKey validationKey="[your_key]" 
    decryptionKey="[your_decryption_key]" validation="SHA1" />
  1. Режим состояния сеанса установлен в состояние сервера

Полагая (1), (2), (3) вместе:

<system.web>
    <httpCookies domain=".your.site"/>
    <machineKey validationKey="your_key" decryptionKey="your_decryption_key" validation="SHA1" />
    <sessionState mode="StateServer" timeout="60" />
    ...
  1. Имя приложения должно быть сопоставлено. Если это не так, только общий идентификатор сеанса можно использовать совместно, но не данные сеанса. Проблема в том, что вы не можете настроить имя своего приложения внутри Web.config. Но мы можем создать свою собственную конфигурацию, а затем ввести ее отражением. Просто введите следующий код в Global.asax.cs:

    public override void Init()
    {
        base.Init();
        try
        {
            // Get the app name from config file...
            string appName = ConfigurationManager.AppSettings["ApplicationName"];
            if (!string.IsNullOrEmpty(appName))
            {
                foreach (string moduleName in this.Modules)
                {
                    IHttpModule module = this.Modules[moduleName];
                    SessionStateModule ssm = module as SessionStateModule;
                    if (ssm != null)
                    {
                        FieldInfo storeInfo = typeof(SessionStateModule).GetField("_store", BindingFlags.Instance | BindingFlags.NonPublic);
                        SessionStateStoreProviderBase store = (SessionStateStoreProviderBase)storeInfo.GetValue(ssm);
                        if (store == null) //In IIS7 Integrated mode, module.Init() is called later
                        {
                            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, appName);
                        }
                        else
                        {
                            Type storeType = store.GetType();
                            if (storeType.Name.Equals("OutOfProcSessionStateStore"))
                            {
                                FieldInfo uribaseInfo = storeType.GetField("s_uribase", BindingFlags.Static | BindingFlags.NonPublic);
                                uribaseInfo.SetValue(storeType, appName);
                            }
                        }
                    }
                }
            }
    
        }
        catch (Exception ex)
        {
            log.Error(ex.Message, ex);
        }
    }
    

    Кредиты переходят к pfemiani, Ли Чен, и кто-то, кого я не помню, комментирует, комментируя его. Пожалуйста, обратите внимание, что ответ pfemiani не работает для меня, но его объединение с ли Чэнь пост.

  2. Убедитесь, что служба состояния ASP.NET запущена. Здесь будут сохранены данные сеанса.