Вопрос

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

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

Это было полезно?

Решение

Добавьте это в ваш 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 соответствовали значениям, хранящимся в таблице поиска, в качестве шага аутентификации.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top