Есть ли способ определить, когда пользователь входит в систему, если есть еще один сеанс с тем же именем пользователя, и заблокировать его от входа в систему или отправить ему сообщение?Ограничить только один сеанс для каждого пользователя в ASP.NET
ответ
Вы всегда можете реализовать события в 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>
, если вы используете сеансы для управления авторизацией, то есть ... –
Я пробовал это решение, но я не могу получить доступ к приложению на Session_End, потому что мой HttpContext.Current имеет значение NULL. Как я могу получить к нему доступ? – Inbal
@FredrikJohansson: Если пользователь закроет браузер, не нажав LogOut, и попробуйте войти в систему с тем же именем пользователя, пользователь не сможет войти в систему. Как мы можем это исправить? – nightfire001
Я реализовал это там, где, когда пользователь входит в систему, он устанавливает флаг в БД, в котором они вошли. Это был int, представляющий, сколько раз они вошли в систему. Мы допустили два. Тогда просто проверьте это при проверке пользователя.
А как вам определить, пользователь вышел из системы? Есть также соединения, которые тайм-аут. Таким образом, вам нужно по крайней мере рутинную работу где-то, чтобы уменьшить это целое число – citronas
Да, это была проблема. Я считаю, что у меня был javascript, выполняющий конгруэнт к таймауту сеанса, и он спрашивал, хотите ли вы оставаться в системе, если нет ответа, тогда это уменьшит счет. Также было то же самое в событии окончания сеанса. У нас также была работа, которая сбросила счет до 0 в середине ночи. – nportelli
Вы можете сохранить SessionID пользователя в базе данных. При каждом входе в систему храните комбинацию уникальных имен пользователей и SessionID в базе данных. На главной странице вы включаете запрос в базу данных, чтобы проверить, что последний логин для текущего используемого имени пользователя был из того же сеанса. Если нет, откройте сеанс и перейдите на страницу входа.
Поведение, которое я опубликовал, должно выйти из второго пользователя. Вы можете изменить Session.Abandon на желаемое поведение
Вы можете, отслеживая пользователей вошедших в систему, в вашем global.asax с помощью объекта Application.
В методе Session_Start или методе входа вы можете проверить, сохранен ли пользователь в объекте Application.
В методе Session_End или в методе выхода из системы вы должны удалить пользователя из объекта Application.
Я пробовал это решение, но я не могу получить доступ к приложению на Session_End, потому что мой HttpContext.Current имеет значение null. Как я могу получить к нему доступ? – Inbal
Не храните его в БД, если вы не можете определить событие выхода из системы (вы можете выйти из системы, закрыть вкладку, закрыть весь браузер или просто закрыть компьютер). Используйте сеанс для выполнения той же проверки.
Посмотрите на эту статью: http://www.sharepoint4developers.net/en-nz/post/limit-session-account.aspx – 2012-02-27 19:45:02