11

у меня есть такой код, который выполняется, когда пользователь имеет право: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> 

Однако пользователи жалуются время сеанса или повторный выход руководство Главная/Несанкционированное после нескольких минут бездействия.

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

+0

Я не понимаю, почему люди путаются с тайм-аутом cookie проверки подлинности и тайм-аутом сеанса сервера. Они представляют собой два разных тонких слова ... mate – Shaz

+0

, вы говорите своему серверу, чтобы истечь время пользователя через 120 минут и на другая рука говорит браузеру cookie, чтобы получить билет на проверку подлинности для 2280 ... очевидно, что билет истекает после 120, а пользователь получает тайм-аут ... пока пользователь все еще держит предыдущий билет аутентификации. – Shaz

+0

Вы явно определили свой «MachineKey» в своей сети. конфиг? – Tommy

ответ

16

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

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

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

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

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

Вот бы example machine key, что вы могли бы разместить в вашем web.config

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

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

+1

хорошее описание –

0

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

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

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

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

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

0

Попробуйте это один:

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> 

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

Смежные вопросы