Сессии и авторизация в asp.net

При разработке сайта (с использованием проверки подлинности с помощью форм и состояния сеанса InProc) часто возникает ситуация, когда я теряю переменные, хранящиеся в сеансе (например, сеанс ["myVar"]), но мой сеанс аутентификации остается действительным.

Это приводит к некоторому странному поведению на моем сайте.

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


person David W.    schedule 05.07.2012    source источник


Ответы (3)


В Asp.Net сеанс и «Вход в систему» ​​- это не одно и то же.

Оба (обычно) контролируются файлами cookie, но файлы cookie являются отдельными.

Чтобы контролировать, как долго сохраняется сеанс, см. ответ Jonas T.

Чтобы контролировать, как долго пользователь остается в системе, вы можете использовать timeOut для элемента <forms ... />:

<system.web>
    <authentication mode="Forms">
        <forms loginUrl="~/Account/Login.aspx" timeout="120" slidingExpiration="true"/>
    </authentication>
    ...
</system.web>

Чтобы избавиться от вашей проблемы, вы должны убедиться, что время ожидания сеанса не меньше времени ожидания проверки подлинности форм.

Если вы разрешаете сохранение файлов cookie при проверке подлинности с помощью форм («Запомнить меня»), то никаких гарантий нет. В этом случае вам просто нужно установить время ожидания сеанса на «достаточно долгое» в соответствии с некоторыми критериями/спецификациями.

Изменить. Также проверьте настройки пула приложений (в IIS), где развернут сайт. И особенно проверьте, что такое «Idle Time-out». Если установлено низкое значение (я думаю, значение по умолчанию — 20 минут), то IIS закроет пул приложений, если за это время не поступило ни одного запроса. Это (конечно) завершает любые существующие внутрипроцессные сеансы.

person user1429080    schedule 05.07.2012

Аутентификация с помощью форм сохраняет свой билет в файле cookie на стороне клиента или в URL-адресе (если файл cookie отключен).

Переменные сеанса хранятся на стороне сервера с истекшим временем. Если вы хотите, чтобы ваша переменная была более постоянной, используйте cookie.

Вы можете увеличить время ожидания сеанса в веб-конфигурации. Это на 20 минут.

<configuration>
  <system.web>
     <sessionState timeout="20"></sessionState>
  </system.web>
</configuration>
person Jonas T    schedule 05.07.2012

Вы сказали, что работаете с аутентификацией/авторизацией форм ASP.NET, тогда я предлагаю вам использовать Профиль вместо Session состояния.

person kv-prajapati    schedule 05.07.2012
comment
Хм, я чувствую, что не должен использовать профиль для хранения временной информации, такой как идентификатор последнего просмотренного продукта. Или я должен? У HttpContext.Profile и HttpContext.User одинаковый жизненный цикл? - person David W.; 05.07.2012
comment
Да. Данные профиля хранятся в базе данных и извлекаются, когда пользователь входит в систему, поэтому я бы предложил состояние профиля. - person kv-prajapati; 05.07.2012
comment
Разве профиль не предлагает хранить данные, такие как имена, почтовые индексы и т. д., а не временные переменные? Пожалуй, мне стоит дочитать... - person David W.; 05.07.2012