Cookie истекает слишком рано или слишком рано

У меня есть такой код, который запускается, когда пользователь авторизован:

 FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(
                 1,
                 email,
                 DateTime.Now,
                 DateTime.Now.AddMinutes(120),
                 true,
                 userData);

        string encTicket = FormsAuthentication.Encrypt(authTicket);
        HttpCookie faCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encTicket);
        faCookie.Expires = authTicket.Expiration;
        Response.Cookies.Add(faCookie);

Затем я перенаправляю контроллер/действие с атрибутом Authrize:

 [Authorize]
    public class ProductsController : Controller
    {

У меня есть следующее в web.config:

 <authentication mode="Forms">
      <forms loginUrl="~/Home/Unauthorized" timeout="2880" />
    </authentication>
    <sessionState timeout="120"></sessionState>

Однако пользователи жалуются на тайм-аут сеанса или перенаправление Home/Unauthorized после нескольких минут бездействия.

что может быть причиной этого, что еще я должен проверить?

Ответ 1

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

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

Что контролирует шифрование и дешифрование куки FormsAuthentication, так это MachineKey для этого веб-приложения в IIS. MachineKey - это набор ключей, используемых для шифрования и дешифрования файла cookie. По умолчанию в веб-приложении IIS установлено автоматическое создание ключа компьютера. Это означает, что при запуске приложения генерируется случайный машинный ключ. Если приложение перезагружается, вы получаете новый ключ компьютера. Кроме того, если вы используете хостинг с общим провайдером, веб-хост будет, как правило, сбалансировать нагрузку на ваше приложение, то есть размещаться на нескольких серверах. Каждый из этих серверов будет автоматически генерировать машинный ключ.

Если ваше веб-приложение находится в сценарии с балансировкой нагрузки, то каждый компьютер в веб-ферме не сможет расшифровать другой зашифрованный файл cookie. Это создаст впечатление "выхода из системы". Примером этого является вход в систему на веб-сервере A, затем последующий запрос направляется на веб-сервер B. Веб-сервер B не разделяет ключ компьютера с веб-сервером A и не может расшифровать cookie, отправляя пользователя обратно на страницу входа.

Решение состоит в том, чтобы определить раздел MachineKey в вашем файле web.config, чтобы каждый экземпляр IIS использовал те же ключи, а также, если пул приложений перезагружается, у вас все еще остается тот же ключ компьютера.

Вот пример машинного ключа (используйте версию.NET 2.0), который вы можете поместить в ваш файл web.config.

<system.web>
  <machineKey validationKey="EBC1EF196CAC273717C9C96D69D8EF314793FCE2DBB98B261D0C7677C8C7760A3483DDE3B631BC42F7B98B4B13EFB17B97A122056862A92B4E7581F15F4B3551" 
    decryptionKey="5740E6E6A968C76C82BB465275E8C6C9CE08E698CE59A60B0BEB2AA2DA1B9AB3" 
    validation="SHA1" decryption="AES" /> 
</system.web>

Дополнительные мысли заключаются в том, что ваш срок действия в файле web.config(2880) и то, что вы на самом деле устанавливаете для срока действия (120), не совпадают. Вы можете хотеть, чтобы они оба соответствовали.

Ответ 2

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

Другие вещи для проверки будут заключаться в том, что метабаза IIS для каждого сервера идентична. Они должны иметь один и тот же путь и идентификатор.

Вы также захотите посмотреть сеанс сеанса из proc (ваш web.config выглядит как в proc), который подвержен перебоям в сети и случайным приёмам приложений.

В основном резюме этой ссылки. http://msdn.microsoft.com/en-us/library/vstudio/ms178586(v=vs.100).aspx

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

Ответ 3

Попробуйте следующее:

web.config Код:

    <system.web>
         <httpRuntime maxRequestLength="40000000" useFullyQualifiedRedirectUrl="true" executionTimeout="600000" />
         <authentication mode="Forms">
               <forms loginUrl="~/Home/Unauthorized" timeout="2880" cookieless="UseCookies" />
          </authentication>    
    </system.web>

Это поможет вам.