2010-05-27 5 views
9

Есть ли способ определить, когда пользователь входит в систему, если есть еще один сеанс с тем же именем пользователя, и заблокировать его от входа в систему или отправить ему сообщение?Ограничить только один сеанс для каждого пользователя в ASP.NET

+1

Посмотрите на эту статью: http://www.sharepoint4developers.net/en-nz/post/limit-session-account.aspx – 2012-02-27 19:45:02

ответ

16

Вы всегда можете реализовать события в global.asax.

Внесите Application_Start(), чтобы установить System.Collections.Dictionary (или по вашему усмотрению) и сохраните это в коллекции Application [], когда пользовательский логин добавит имя пользователя. Удалить из коллекции в Session_End(). Не забудьте использовать ключевое слово «lock» во время работы с коллекцией :)

Удачи!

Пример:

[page.aspx] 
public partial class page : System.Web.UI.Page { 
    protected bool Login(string userName) { 
     System.Collections.Generic.List<string> d = Application["UsersLoggedIn"] 
      as System.Collections.Generic.List<string>; 
     if (d != null) { 
      lock (d) { 
       if (d.Contains(userName)) { 
        // User is already logged in!!! 
        return false; 
       } 
       d.Add(userName); 
      } 
     } 
     Session["UserLoggedIn"] = userName; 
     return true; 
    } 

    protected void Logout() { 
     Session.Abandon(); 
    } 
} 

[global.asax] 
<%@ Application Language="C#" %> 
<script RunAt="server"> 
    void Application_Start(object sender, EventArgs e) { 
     Application["UsersLoggedIn"] = new System.Collections.Generic.List<string>(); 
    } 

    void Session_End(object sender, EventArgs e) { 
     // NOTE: you might want to call this from the .Logout() method - aswell -, to speed things up 
     string userLoggedIn = Session["UserLoggedIn"] == null ? string.Empty ? (string)Session["UserLoggedIn"]; 
     if (userLoggedIn.Length > 0) { 
      System.Collections.Generic.List<string> d = Application["UsersLoggedIn"] 
       as System.Collections.Generic.List<string>; 
      if (d != null) { 
       lock (d) { 
        d.Remove(userLoggedIn); 
       } 
      } 
     } 
    } 
</script> 
+0

, если вы используете сеансы для управления авторизацией, то есть ... –

+0

Я пробовал это решение, но я не могу получить доступ к приложению на Session_End, потому что мой HttpContext.Current имеет значение NULL. Как я могу получить к нему доступ? – Inbal

+0

@FredrikJohansson: Если пользователь закроет браузер, не нажав LogOut, и попробуйте войти в систему с тем же именем пользователя, пользователь не сможет войти в систему. Как мы можем это исправить? – nightfire001

3

Я реализовал это там, где, когда пользователь входит в систему, он устанавливает флаг в БД, в котором они вошли. Это был int, представляющий, сколько раз они вошли в систему. Мы допустили два. Тогда просто проверьте это при проверке пользователя.

+0

А как вам определить, пользователь вышел из системы? Есть также соединения, которые тайм-аут. Таким образом, вам нужно по крайней мере рутинную работу где-то, чтобы уменьшить это целое число – citronas

+0

Да, это была проблема. Я считаю, что у меня был javascript, выполняющий конгруэнт к таймауту сеанса, и он спрашивал, хотите ли вы оставаться в системе, если нет ответа, тогда это уменьшит счет. Также было то же самое в событии окончания сеанса. У нас также была работа, которая сбросила счет до 0 в середине ночи. – nportelli

0

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

Поведение, которое я опубликовал, должно выйти из второго пользователя. Вы можете изменить Session.Abandon на желаемое поведение

2

Вы можете, отслеживая пользователей вошедших в систему, в вашем global.asax с помощью объекта Application.

В методе Session_Start или методе входа вы можете проверить, сохранен ли пользователь в объекте Application.

В методе Session_End или в методе выхода из системы вы должны удалить пользователя из объекта Application.

+0

Я пробовал это решение, но я не могу получить доступ к приложению на Session_End, потому что мой HttpContext.Current имеет значение null. Как я могу получить к нему доступ? – Inbal

1

Не храните его в БД, если вы не можете определить событие выхода из системы (вы можете выйти из системы, закрыть вкладку, закрыть весь браузер или просто закрыть компьютер). Используйте сеанс для выполнения той же проверки.