Сайт ASP.NET Webforms, использующий HTTPCookie, со временем ожидания 100 лет через 20 минут - PullRequest
0 голосов
/ 12 июня 2010

У меня есть сайт, который использует Forms Auth.Клиент не хочет, чтобы сеанс сайта вообще истекал для пользователей.В кодовой странице страницы входа используется следующий код:

// user passed validation
FormsAuthentication.Initialize();

// grab the user's roles out of the database 
String strRole = AssignRoles(UserName.Text);

// creates forms auth ticket with expiration date of 100 years from now and make it persistent
FormsAuthenticationTicket fat = new FormsAuthenticationTicket(1,
  UserName.Text, DateTime.Now,
  DateTime.Now.AddYears(100), true, strRole,
  FormsAuthentication.FormsCookiePath);

// create a cookie and throw the ticket in there, set expiration date to 100 years from now
HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, 
  FormsAuthentication.Encrypt(fat)) { Expires = DateTime.Now.AddYears(100) };

// add the cookie to the response queue
Response.Cookies.Add(cookie);

Response.Redirect(FormsAuthentication.GetRedirectUrl(UserName.Text, false));

Раздел аутентификации файла web.config выглядит следующим образом:

<authentication mode="Forms">
      <forms name="APLOnlineCompliance" loginUrl="~/Login.aspx" defaultUrl="~/Course/CourseViewer.aspx" />
</authentication>

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

Выход HttpFox http://cid -e79f8e4b07c3e30f.office.live.com / embedphoto.aspx / Public / SessionProblem.png

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

Есть идеи, как это исправить?

Ответы [ 5 ]

2 голосов
/ 12 июня 2010

Время ожидания сеанса и время проверки подлинности с помощью форм - это две разные вещи. Установлено ли время ожидания сеанса на 20 минут, и будет ли оно случайно регистрировать пользователей в событии Session_End в файле Global.asax?

1 голос
/ 19 августа 2010

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

0 голосов
/ 13 ноября 2011

Возможно, вы захотите проверить, используете ли вы балансировщик нагрузки. Если так, то на самом деле вы не должны хранить InProc. Должен искать сервер состояний или sql-сервер, если у вас несколько сущностей.

Исходя из этой проблемы, кажется, что по умолчанию 30 минут не соблюдаются, что обычно указывает на IIS / Hosting / Network configuration.

0 голосов
/ 25 июля 2011

Еще одна быстрая вещь, которую нужно проверить, это тип вашего хостинга.Облачный хостинг, как правило, будет иметь балансировщик нагрузки, который будет жестко настроен на то, чтобы один и тот же IP-адрес указывал на сервер узла в течение ~ 20 минут, однако по истечении этого времени вы можете быть перенаправлены на новый сервер, создав новый сеанс на новом сервере и «регистрируя васout '

Если вы используете стандартный общий хостинг или один выделенный сервер или виртуальный сервер, однако это не будет проблемой:)

Чтобы обойти это и сохранить рабочие сессии asp.netвам нужно переместить состояние сеанса в базу данных - или заново оборудовать ваш код, чтобы вообще не использовать сеансы:)

0 голосов
/ 12 июня 2010

Ну, у меня есть следующее в Global.asax:

protected void Application_AuthenticateRequest(Object sender, EventArgs e)
    {
        //Fires upon attempting to authenticate the use
        if (!(HttpContext.Current.User == null))
        {
            if (HttpContext.Current.User.Identity.IsAuthenticated)
            {
                if (HttpContext.Current.User.Identity.GetType() == typeof(FormsIdentity))
                {
                    FormsIdentity fi = (FormsIdentity) HttpContext.Current.User.Identity;
                    FormsAuthenticationTicket fat = fi.Ticket;

                    String[] astrRoles = fat.UserData.Split('|');
                    HttpContext.Current.User = new GenericPrincipal(fi, astrRoles);
                }
            }
        }
    }

Это то, что вы имеете в виду?Кроме того, мы находимся в среде IIS6, если это имеет какое-либо значение.

...