Итерация по существующим объектам Session - PullRequest
2 голосов
/ 23 октября 2009

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

Есть ли способ перебирать существующие сеансы и убивать их?

Ответы [ 5 ]

2 голосов
/ 23 октября 2009

Добавьте это в ваш 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);
}
0 голосов
/ 23 октября 2009

С манжеты:

При Session_Start (обычно при успешном входе в систему) сохраните UserID пользователя и SessionID в таблице поиска (или новый столбец в таблице пользователей).

При каждом запросе вам необходимо проверять, чтобы идентификаторы UserID (сохраненные в Session) и SessionID соответствовали значениям, хранящимся в таблице поиска, в качестве шага аутентификации.

0 голосов
/ 23 октября 2009

Краткий ответ: нет.

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

0 голосов
/ 23 октября 2009

Однажды, когда я это реализовал, я сохранил идентификаторы пользователя (или что-то уникальное) в переменной приложения, словаре или массиве. Легко проверить наличие идентификатора пользователя в словаре приложения при входе в систему. Единственная реальная проблема - это люди, которые не выходят из системы и просто закрывают браузер. Вы никогда не найдете надежного способа обнаружения этого события.

0 голосов
/ 23 октября 2009

вы можете сохранить зарегистрированных пользователей в базе данных и проверить, если они уже вошли в систему, вы можете запретить им войти снова. используя метод Session_Start в Global.asax.

...