Заметки о Windows и других программных продуктах Microsoft...

Настройка Session State server для IIS

Настройка Session State server для IIS

Одной из основных особенностей протокола HTTP является то, что он не сохраняет информацию о клиенте между запросами, то есть не идентифицирует клиента. Связь между клиентом и сервером заканчивается как только завершается обработка текущего запроса. Каждый новый запрос к серверу считается абсолютно уникальным и независимым, даже если он был отправлен повторно от одного и того же источника. Что это значит?

Если на странице представлена статичная информация, например статья, состоящая из текста и изображений, то ассоциировать запрос с конкретным пользователем вовсе не обязательно. Содержание статьи никак не изменится, будь то десять запросов с одного устройства, либо десять запросов от разных людей с разных устройств.

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

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

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

Для управление клиентскими сессиями в ASP.NET используется механизм управления состоянием сессии (SessionState). Принцип его работы следующий:

• Для каждого нового запроса на сервер (неважно, разные это клиенты или один) генерируется уникальный идентификатор сессии, который представляет собой случайное число, закодированное с помощью специального алгоритма в строку длиной 24 символа. Строка состоит из букв от A до Z в нижнем регистре и чисел от 0 до 5.
• Если в течение текущего запроса данные клиента НЕ сохраняются для дальнейшей работы с ними, то время жизни сессии этого клиента заканчивается,  фактически не начавшись. При этом ранее сгенерированный идентификатор сессии становится недействительным, так как не был использован. В ответ на такой запрос клиент не получает ничего, что бы связало его с новой сессией.
• Если же данные клиента (например, имя, адрес и т.п.) сохраняются на сервере, ASP.NET связывает сохраненные данные с ранее сгенерированным идентификатором сессии. Далее создается специальная сессионная куки, в которую записывается также этот идентификатор. Эта куки добавляется в ответ на запрос и сохраняется в браузере клиента. Таким образом, создается связь клиента и его персонализированной информации на сервере. Новая сессия для данного клиента создана.
• При каждом следующем запросе клиент передает на сервер персональный идентификатор сессии через куки. Сервер сопоставляет идентификаторы и узнает клиента в рамках текущей сессии.
• До тех пор, пока клиент передает свой персональный ключ, сессия считается активной. Также сессия может закончиться по разным причинам, например, вручную на стороне сервера или по истечении какого-то установленного времени (таймаут).

Сама сессия пользователя физически должна где то храниться. В IIS для хранения сессий есть несколько вариантов:

• In-Process — сессия хранится на веб сервере, в памяти рабочего процесса, в котором запущено веб-приложение.
• State Server — сессия хранится на отдельном сервере (State Server).
• SQL Server — сессия хранится в базе данных MSSQL.
• Custom — для хранения сессий используется стороннее решение, например Redis.

Каждый способ имеет свои достоинства и недостатки. На мой взгляд, наиболее сбалансированным решением в плане удобства, простоты и эффективности является использование State Server. О том, как его настроить и использовать в IIS и пойдет дальше речь.

Установка State Service

Для хранения сессий в Windows используется специальный сервис ASP.NET State Service. По умолчанию этот сервис не установлен. Для работы сервиса требуется установить серверный компонент ASP.NET 4.5, который может ставиться как в составе веб сервера, так и отдельно.

При установке на веб-сервер при выборе компонентов для роли надо выбрать компонент ASP.NET 4.5, который находится в разделе «Application Development».

установка роли state server в составе веб сервера

 

Для обычного (не веб) сервера компонент находится в серверных компонентах (Features) в разделе «.NET Framework 4.5 Features».

установка роли state server

 

Также компонент можно установить с помощью PowerShell, командой:

Add-WindowsFeature NET-Framework-45-ASPNET

Примечание. Версия ASP.NET может изменяться в зависимости от версии ОС — ASP.NET 4.5 в Windows Server 2012 R2, 4.6 в Windows Server 2016 и т.д. Команда PowerShell остается неизменной.

установка роли state server через PowerShell

 

После установки компонента сервис ASP.NET State Service  появляется в списке сервисов, но по умолчанию он не запущен. Для нормальной работы надо установить для него режим запуска Automatic и стартовать его.

включение сервиса state service

 

Это еще не все. Для того, чтобы сервис принимал запросы на подключение, необходимо перейти в раздел реестра HKLM\SYSTEM\CurrentControlSet\Services\aspnet_state\Parameters и установить для параметра AllowRemoteConnection значение 1. Здесь же в параметре Port указан номер порта, на котором сервис будет принимать подключения. По умолчанию это порт 42424, при необходимости его можно изменить.

Примечание. Для того, чтобы изменения параметров вступили в силу, необходимо перезапустить сервис. Ну и конечно же необходимо проверить, что сервер доступен по указанному порту.

настройки реестра State Server

Настройка IIS для использования State Server

Тепер остается настроить веб-приложение на использование State Server для хранения клиентских сессий. Сделать это можно различными способами, например из графической оснастки IIS Manager. Для этого переходив к свойствам сайта и в разделе ASP.NET выбираем пункт «Session State».

настройки веб-сервера

 

В открывшемся окне выбираем способ хранения сессий «State Server» и заполняем строку подключения (Connection string). В строке подключения указываем IP-адрес сервера и порт подключения, например так:

tcpip=192.168.0.1:42424

Дополнительно можно задать таймаут подключения —  максимальное количество секунд, в течение которых должен ожидаться ответ от службы, прежде чем запрос будет отменен. По умолчанию это значение равно 10 секундам. Также с помощью чекбокса «Enable Compression» можно включить режим сжатия. В этом режиме ASP.NET сжимает сериализованные данные сессии перед помещением их в хранилище сессий, а при извлечении соответственно разжимает.

настройка хранения сессий в IIS

 

Также настройки сессий можно произвести напрямую в файле web.config приложения. Для этого надо в секции system.web добавить например такую строчку:

sessionState mode="StateServer" stateConnectionString="tcpip=192.168.0.1:42424"

настройка хранения сессий в web.config

 

 
 
Комментарии
Серджео Таччини

Я прошу прощения, не могу понять с какого периода произошли изменения в IIS, в результате чего, в урлах моего сайта, после домена, стал добавляться ключ сессии. Вида:
https://domen/(X(1)S(00uqsbp3uuurac4e0wka2yo2))/Catalag/…
https://domen/(X(1)S(03ws5qixfvektflsdhdz4alb))/…
https://domen/(X(1)S(05r3sbazxivfewxxjjczrsxa))/…

в вебконфиге в system.web, есть значения:

и

из-за чего могут генерится подобные абракадабры? Нагугливаются такие ссылки:
https://html.developreference.com/article/27511186/problem+with+aspx+url
https://security.stackexchange.com/questions/90609/random-url-string-what-kind-of-attack-is-this-and-what-can-be-done-to-stop-it
в настройках iis сайта установлено InProcess для Session State (но может это совсем другое…).
В общем, я не могу решить проблему всё равно. Если есть советы, пожалуйста, напишите.

Там в первой ссылке говорится, что отключена поддержка куки. Для включения строка в веб-конфиге должна выглядеть примерно так:

Leave a Reply to Kirill