2014-08-28 4 views
3

В ASP.NET MVC в одной из служб WCF я помещаю объект в объект HttpContext.Current.Session.Отключить пользователя при завершении сеанса ASP.NET MVC

Когда сеанс истекает, и сеанс очищается от всех объектов, я хочу, чтобы пользователь отключил, но не смог найти способ.

В Global.asax

когда метод Session_End называется объект Response и HttpContext.Current оба нуль.

Оценены любые идеи о том, как отладить пользователя.

+0

Не будет ли это зависеть от того, как вы внедрили членство в первую очередь? –

+0

Извините за мое невежество, просто поддерживая существующую работу и не привязанный ко всему.Существует контроллер с методом Login, который использует ttpContext.GetOwinContext(). Аутентификация и вызовы методов SignIn и SignoOut соответственно для входа и выхода пользователей. Я не уверен, как вызывать этот контроллер из файла Global.asx или просто, когда сессия заканчивается вообще. – TheWommies

+0

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

ответ

2

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

SignIn и signout имеют отношение к добавлению или удалению файлов cookie или токенов для аутентификации с помощью внешней службы. Вызов, который вы видите, должен находиться в контроллере входа в систему и не должен быть перемещен в global.asax.

Никаких дополнительных действий не требуется.

1

Я считаю неправильной практикой пытаться синхронизировать сеанс и аутентификацию cookie. Сессия и cookie - это разные вещи. Вы можете войти в систему с несколькими пользователями за тот же период сеанса. Вы начинаете новый сеанс, когда открываете какой-либо URL-адрес, и заканчивается, когда вы закрываете окно или оно истекает на стороне сервера. Для получения дополнительной информации о связях cookie проверки подлинности сеанса, пожалуйста, прочитайте следующий ответ: asp.net cookies, authentication and session timeouts

В любом случае, если вы хотите это сделать, вы можете использовать один небольшой трюк. Вы должны периодически звонить на сервер с помощью ajax-вызова, например, называть страницу YourWebsite.com/chcecksession каждые n секунд. Там вам нужно проверить наличие переменной сеанса. Если он больше не существует, просто вызовите FormsAuthentication.SignOut(), обновите страницу, и пользователь выйдет из системы.

+0

Вместо файлов cookie есть что-то не так с использованием претензий для добавления дополнительной информации о пользователе? – TheWommies

+0

@ TheWommies утверждает, что они предназначены для хранения информации, связанной с пользователем, поэтому их можно использовать. –

+0

Спасибо, просто любопытно не периодически опроса сервера просто сбрасывает тайм-аут сеанса? Поэтому сеанс никогда не истечет, что я хочу, если пользователь неактивен. – TheWommies

1

Я не уверен в вашей имплантации WCF, поскольку я не так разбираюсь в WCF. В настоящее время я создаю большое приложение для стипендий, и мы хотим ограничить логины одним логином для каждого пользователя. У меня есть настройка таблицы для отслеживания идентификатора пользователя и GUID, который я храню в своем Auth Cookie. Вместо этого вы можете использовать идентификатор сеанса. Я буду кэшировать таблицу и обновлять кеш при каждом добавлении или удалении записи. Я использую SignalR (вы можете получить пакет NuGet) для поддержания связей с каждым из наших клиентов. Когда они закрывают свой браузер, SignalR может сразу сообщить, что пользователь ушел, и я могу закончить их запись из таблицы отслеживания сеансов. В вашем случае вы можете убить сеанс. Кроме того, если пользователь снова пытается войти в систему, я вижу, что они уже вошли в систему. Затем я убиваю их исходный сеанс и разрешаю им входить в систему.

Потребовалось несколько часов, чтобы привыкнуть к использованию SignalR, и я настоятельно рекомендую видео на Plural Sight.

1

Установите оба таймаута в следующей конфигурации на точное количество минут. Убедитесь, что для параметра slideExpiration установлено значение true, то же самое, что и проверка подлинности будет продолжаться до 30 минут после каждого запроса, так как сеанс продолжает расширяться после каждого запроса.

<authentication mode="Forms"> 
    <forms loginUrl="~/Auth/SignOn.aspx" timeout="30" slidingExpiration="true" /> 
</authentication> 

<sessionState timeout="30" /> 
+0

Код использует ApplicationCookie, как показано ниже: Есть ли способ изменить ExpireTimeSpan после запуска приложения? Это зависит от того, что пользователь вошел в систему, как я хочу, чтобы установить время app.UseCookieAuthentication (новые CookieAuthenticationOptions { AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, AuthenticationMode = AuthenticationMode.Active, LoginPath = новый PathString (»/Account/Login ") ExpireTimeSpan = TimeSpan.FromSeconds (5) }); – TheWommies

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