Как я могу создать сайт ASP.NET, который имеет индивидуальную аутентификацию / время ожидания сеанса для каждого пользователя? - PullRequest
2 голосов
/ 04 апреля 2011

Я пытаюсь создать сайт ASP.NET, который позволяет каждому пользователю устанавливать собственное значение времени ожидания сеанса.По сути, с точки зрения пользователя, если они устанавливают значение времени ожидания равным 30, то это означает, что после 30 минут бездействия они должны пройти повторную аутентификацию.Если они устанавливают для своего значения тайм-аута значение 0, это означает, что они могут оставить браузер открытым, сколько захотят, и их сеанс никогда не истечет - им никогда не придется повторно проходить аутентификацию.Это отличается от функции «запомнить меня».Если они закроют свой браузер, им придется пройти повторную аутентификацию.

В настоящее время я использую проверку подлинности с помощью форм в своем приложении, и у меня есть один объект, который я храню в сеансе ASP.NET.Этот объект является пользовательским объектом «Пользователь», который содержит несколько различных сведений о текущем пользователе.

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

В настоящее время на моей странице входа я использую элемент управления входом ASP.NET.У меня есть пользовательский код в событии Login_Authenticate для авторизации пользователя.Затем у меня есть следующий код в событии Login_LoggedIn для установки билета аутентификации.

HttpCookie _authCookie = Response.Cookies[FormsAuthentication.FormsCookieName];
FormsAuthenticationTicket _oldAuthTicket = FormsAuthentication.Decrypt(_authCookie.Value);
HttpContext.Current.Response.Cookies.Remove(FormsAuthentication.FormsCookieName);
FormsAuthenticationTicket _newAuthTicket;
if(myObject.LoginTimeout > 0)
{
    _newAuthTicket = new FormsAuthenticationTicket(_oldAuthTicket.Version, _oldAuthTicket.Name, DateTime.Now, DateTime.Now.AddMinutes(myObject.LoginTimeout), _oldAuthTicket.IsPersistent, _oldAuthTicket.UserData, FormsAuthentication.FormsCookiePath);
}
else
{
    _newAuthTicket = new FormsAuthenticationTicket(_oldAuthTicket.Version, _oldAuthTicket.Name, DateTime.Now, DateTime.Now.AddYears(10), _oldAuthTicket.IsPersistent, _oldAuthTicket.UserData, FormsAuthentication.FormsCookiePath);
}
string _encryptedTicket = FormsAuthentication.Encrypt(_newAuthTicket);
_authCookie = new HttpCookie(FormsAuthentication.FormsCookieName, _encryptedTicket);
HttpContext.Current.Response.Cookies.Add(_authCookie);

1 Ответ

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

Вы можете выбрать какое-то произвольное истечение срока действия, скажем, через 2 месяца. Настройте проверку подлинности на основе форм, чтобы использовать ее в качестве значения (также убедитесь, что истекает срок действия билета проверки подлинности форм).

На этом этапе вы захотите написать собственный модуль Http (или использовать global.asax) и либо в начале запроса вы проверяете билет FormAuth, чтобы увидеть, когда он был выпущен, запросить хранилище данных, чтобы получить время ожидания сеанса пользователя. Сравните разницу между ними (возможно, стоит рассмотреть вопрос о сохранении промежутка времени) и, если пользователь находится за пределами продолжительности сеанса, позвонить FormsAuthentication.SignOut()

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...