Пользователи вынуждены повторно входить в систему случайным образом, до достижения значений тайм-аута сеанса и аутентификации - PullRequest
6 голосов
/ 19 февраля 2009

У меня есть сообщения и жалобы от моего пользователя о том, что они будут использовать экран и сразу же после следующего запроса будут возвращены на экран входа в систему. Это происходит не всегда, а случайно. После просмотра веб-сервера в журнале событий приложений появляется ошибка:

Код события: 4005 Сообщение о событии: проверка подлинности с помощью форм для запроса не удалась. Причина: срок действия билета истек.

Все, что я читаю, начинается с того, что люди спрашивают о веб-садах или балансировке нагрузки. Мы не используем ни один из них. Мы являемся одним сервером Windows 2003 (32-разрядная ОС, 64-разрядное оборудование) с IIS6. Это единственный веб-сайт на этом сервере.

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

Вот что я установил в своем web.config для приложения в корне:

<authentication mode="Forms">
      <forms name=".TcaNet"
        protection="All"
        timeout="40"
        loginUrl="~/Login.aspx"
        defaultUrl="~/MyHome.aspx"
        path="/"
        slidingExpiration="true"
        requireSSL="false" />
    </authentication>

Я также читал, что если у вас есть настройки локаций, которые больше не существуют или являются поддельными, у вас могут возникнуть проблемы. Все мои атрибуты пути являются действительными каталогами, поэтому проблем не должно быть:

<location path="js">
    <system.web>
      <authorization>
        <allow users="*" />
      </authorization>
    </system.web>
  </location>
  <location path="images">
    <system.web>
      <authorization>
        <allow users="*" />
      </authorization>
    </system.web>
  </location>
  <location path="anon">
    <system.web>
      <authorization>
        <allow users="*" />
      </authorization>
    </system.web>
  </location>
  <location path="App_Themes">
    <system.web>
      <authorization>
        <allow users="*" />
      </authorization>
    </system.web>
  </location>
  <location path="NonSSL">
    <system.web>
      <authorization>
        <allow users="*" />
      </authorization>
    </system.web>
  </location>

Единственное, что мне неясно, это то, должно ли мое значение тайм-аута в свойстве форм для заявки на аутентификацию совпадать со значением моего тайм-аута сеанса (определенным в конфигурации приложения в IIS). Я читал некоторые вещи, в которых говорится, что время аутентификации должно быть короче (40), чем время сеанса (45), чтобы избежать возможных осложнений. В любом случае, у нас есть пользователи, которых выводят на экран входа в систему через минуту или две после их последнего действия. Так что сессия определенно не должна заканчиваться.

Обновление 2/23/09: с тех пор я установил значения времени ожидания сеанса и билета проверки подлинности равными 45, и проблема, похоже, все еще возникает.

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

<authentication mode="Forms">
            <forms name=".TcaNet" 
            protection="All" 
            timeout="40" 
            loginUrl="~/Login.aspx" 
            defaultUrl="~/MyHome.aspx" 
            path="/" 
            slidingExpiration="true" 
            requireSSL="true" />
        </authentication>

И хотя я не верю, что это применимо, если вы не в веб-саду, оба значения машинных ключей в обоих файлах web.config установлены одинаково (для удобства удалены):

<machineKey 
        validationKey="<MYVALIDATIONKEYHERE>" 
        decryptionKey="<MYDECRYPTIONKEYHERE>" 
        validation="SHA1" />

<machineKey 
        validationKey="<MYVALIDATIONKEYHERE>" 
        decryptionKey="<MYDECRYPTIONKEYHERE>" 
        validation="SHA1"/>

Любая помощь с этим будет принята с благодарностью. Похоже, это одна из тех проблем, которая дает массу результатов Google, но ни одна из них пока не вписывается в мою ситуацию.

Ответы [ 5 ]

2 голосов
/ 24 февраля 2009

Возможно, стоит проверить свойство Maximum Worker Processes для вашего пула приложений. Если вы используете в сеансе памяти и имеете более одного максимального рабочего процесса, вы можете обнаружить проблемы сеанса, поскольку запрос пользователя обрабатывается другим потоком, который не знает о своем сеансе.

1 голос
/ 29 апреля 2011

Поскольку вы отметили, что используете для своего сайта очень конкретное полное доменное имя, есть ли у вас другие приложения .Net, работающие под тем же полным доменным именем, но только с разными виртуальными путями? Имя файла cookie аутентификации может быть одинаковым для обоих приложений, но токен будет другим. Поэтому, если я войду на www.domain.com, а затем на www.domain.com/app2, у меня больше не будет правильной аутентификации для app1.

0 голосов
/ 10 августа 2016

Наш сайт годами сталкивался с той же проблемой, но вчера мы нашли исправление, см. мой вопрос . Как предложил комментатор, я попытался добавить это в web.config:

<sessionState mode="InProc" timeout="60" />

Очевидно, что тайм-аут должен быть установлен как в sessionState, так и в билете. См. Также документ MS в https://msdn.microsoft.com/en-us/library/ms178586.aspx

Чтобы более точно измерить фактическое время ожидания в режиме отладки, я нашел удобным добавить Debug.WriteLine вызовов в файл Global.asax.cs в методы Session_Start() и Session_End(), с добавлением миллисекунды с использованием

string.Format("{0:HH:mm:ss.fff} - {1}", DateTime.Now, strMessage);

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

0 голосов
/ 10 сентября 2015

Я только что закончил решать эту точную проблему, точно так, как описано в вопросе, и проблема заключалась в том, что в web.config отсутствовал какой-либо конфиг.

При использовании formsAuthentication вам необходимо прекратить аутентификацию дескриптора сеанса, поскольку теперь за него отвечает cookie.

Эта строка должна быть добавлена ​​(или обновлена) в вашей веб-конфигурации, в элементе "system.web"

<sessionState mode="Off">

sessionState и formsAuthentication не должны быть активными одновременно. Я не понимаю мелких деталей того, как они взаимодействуют друг с другом, но в этом случае он генерировал случайные выходы случайных пользователей в случайное время.

0 голосов
/ 19 февраля 2009

1.) Проверьте, как часто ваш процесс iis перерабатывается. (Включите logging и , проверьте ваши настройки ). После перезагрузки, используя значение по умолчанию в хранилище сеансов proc, сеанс теряется.

2.) Ваше приложение порождает потоки, которые могут генерировать исключение (которые, кстати, не отображаются пользователю)? Потому что, если такая ситуация существует, iis гораздо чаще перезапускает процессы.

...