Событие для захвата, когда пользователь, прошедший проверку подлинности с помощью форм, не прошел проверку подлинности - PullRequest
3 голосов
/ 26 января 2009

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

Обновление: Если я не могу определить, когда конкретный пользователь деаутентифицирован (например, из-за тайм-аута сеанса), то есть ли способ получить список всех аутентифицированных в настоящее время пользователей? Если бы я мог, то в Session_End я мог бы просто удалить записи из БД, которые не связаны с аутентифицированными в настоящее время пользователями.

Ответы [ 4 ]

2 голосов
/ 26 января 2009

Session_End не гарантированно срабатывает - если вы, например, не используете сеансы InProc, он вообще не будет срабатывать. Если ваше приложение перезагружается или умирает, оно снова не сработает.

Лучше всего иметь этот код в общем методе, который можно вызывать из разных мест:

  1. В вашем LoginStatus элементе управления вы можете установить событие LoggingOut - вызовите свой метод там, чтобы обрабатывать людей, которые разумно выходят из системы.
  2. Если вы используете сеансы InProc, в своем событии Session_End, но не забудьте проверить, не вышли ли они из системы уже (как вы видели).
  3. Если вы не используете сессии InProc, вам нужно проявить немного больше творчества. Возможно, посмотрите на наличие события, которое запускается время от времени (возможно, на Session_Start, которое срабатывает независимо), которое проходит и очищает тех пользователей, которые в последний раз активнее времени превышают время ожидания сеанса (как упомянул Грег).

К сожалению, класс Членство дает вам некоторые полезные детали, но не все из них:

GetNumberOfUsersOnline

Будет «Получать количество пользователей, которые в данный момент обращаются к приложению». - отлично, но единственные методы, которые получат пользователи, либо:

GetAllUsers      // Gets all the users from the storage provider (can be paged)
FindUsersByName
FindUsersByEmail

К сожалению, ни у одного из них нет свойства возвращать только "активных пользователей" согласно количеству.

Глядя на членов MembershipUser, нет свойства "IsOnline" - только LastLogonDate и LastActivtyDate - из-за отключенной природы сети, это, вероятно, так же хорошо, как вы собираетесь получить.

0 голосов
/ 26 января 2009

В Global.asax есть обработчик Session_End, в который вы можете поместить, который вы хотите выполнить, когда истечет время сеанса.

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

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

0 голосов
/ 26 января 2009

Если вы используете провайдер SQL, таблица aspnet_Users имеет столбец «LastActivityDate». Если вы сравните это со значением тайм-аута проверки подлинности форм, вы можете получить список пользователей, которые точно не вошли в систему. Ваш счет будет низким, если они выйдут вручную со ссылкой «Выйти».

0 голосов
/ 26 января 2009

Я полагаю, у вас есть выход из системы с помощью нажатия кнопки или ссылки или чего-то в этом роде. Почему бы просто не поместить код в то же событие / блок. Рядом с местом, куда вы помещаете вызов FormsAuthentication.SignOut ().

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