Итерация по существующим объектам Session
-
06-07-2019 - |
Вопрос
Я хочу иметь возможность убивать существующие сеансы для одного и того же имени пользователя, когда кто-то входит в систему, чтобы запретить нескольким людям использовать один и тот же логин.
Есть ли способ перебирать существующие сессии и убивать их?
Решение
Добавьте это в ваш global.asax
protected void Application_Start(object sender, EventArgs e)
{
Application["sessions"] = new List<HttpSessionState>();
}
protected void Session_Start(object sender, EventArgs e)
{
var sessions = (List<HttpSessionState>)Application["sessions"];
sessions.Add(this.Session);
}
protected void Session_End(object sender, EventArgs e)
{
var sessions = (List<HttpSessionState>)Application["sessions"];
sessions.Remove(this.Session);
}
Теперь вы можете перебирать свои сессии следующим образом
var sessions = (List<HttpSessionState>)Application["sessions"];
foreach (var session in sessions)
...
Чтобы убить другие сеансы, вы можете проверить метод Session_Start
для старого сеанса, отказаться от него. Это может выглядеть примерно так. Р>
protected void Session_Start(object sender, EventArgs e)
{
var userId = (int)this.Session["userId"];
foreach (var session in sessions)
if ((int)session["userId"] == userId)
session.Abandon();
var sessions = (List<HttpSessionState>)Application["sessions"];
sessions.Add(this.Session);
}
Другие советы
вы можете сохранить зарегистрированных пользователей в базе данных и проверить, если они уже вошли в систему, вы можете запретить им войти снова. используя метод Session_Start в Global.asax.
Краткий ответ: нет. Р>
Длинный ответ: вам нужно реализовать свой собственный поставщик сеансов. Из-за соображений безопасности один сеанс не может ссылаться на другой сеанс. Вам нужно будет обойтись и реализовать собственное управление сессиями.
Однажды, когда я это реализовал, я сохранил идентификаторы пользователя (или что-то уникальное) в переменной приложения, словаре или массиве. Легко проверить наличие идентификатора пользователя в словаре приложения при входе в систему. Единственная реальная проблема - это люди, которые не выходят из системы и просто закрывают браузер. Вы никогда не найдете надежного способа обнаружения этого события.
С манжеты:
В Session_Start (обычно успешном входе в систему) сохраните UserID пользователя и SessionID в таблице поиска (или новый столбец в таблице пользователей).
При каждом запросе вам необходимо проверять, чтобы идентификаторы UserID (сохраненные в Session) и SessionID соответствовали значениям, хранящимся в таблице поиска, в качестве шага аутентификации.