Войти все остальные браузеры на логине
-
20-12-2019 - |
Вопрос
У меня есть проект, запущенный MVC4 и используя простое членство для аутентификации. Я только хочу позволить пользователю войти в один браузер. Чтобы сделать этот прозрачный пользователю, мне нужен способ иметь любой другой аутентифицированный браузер, который выходит в систему, когда пользователь входит в систему. Это означает, что два пользователя пытаются использовать один и тот же логин, они просто будут постоянно ударять друг друга Очень непродуктивно.
прямо сейчас, у меня он настроил, чтобы позволить пользователю только один раз входить в систему, но если этот пользователь должен был закрыть браузер и перейти на другой компьютер, они будут заблокированы в течение 30 минут, я мог бы увидеть это создание ряд Ненужные опоры в поддержку.
Я бы предположил, что мне нужно отслеживать какой-то идентификатор в базе данных и проверять, чтобы убедиться, что он совпадает с каждым запросом, в противном случае они вышли из системы. Возможно, добавляя какое-то печенье.
Если у кого-то есть элегантное решение этого, я был бы признателен!
Это то, что я в настоящее время использую для блокировки пользователей только в одном входе в систему:
Логин:
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public ActionResult Login(LoginModel model, string returnUrl)
{
string sKey = model.UserName;
string sUser = Convert.ToString(System.Web.HttpContext.Current.Cache[sKey]);
if (sUser == null || sUser == String.Empty)
{
TimeSpan SessTimeOut = new TimeSpan(0, 0, System.Web.HttpContext.Current.Session.Timeout, 0, 0);
System.Web.HttpContext.Current.Cache.Insert(sKey, sKey, null, DateTime.MaxValue, SessTimeOut, System.Web.Caching.CacheItemPriority.NotRemovable, null);
Session["user"] = model.UserName;
if (ModelState.IsValid && WebSecurity.Login(model.UserName, model.Password, persistCookie: model.RememberMe))
{
return RedirectToLocal(returnUrl);
}
// If we got this far, something failed, redisplay form
ModelState.AddModelError("", "The user name or password provided is incorrect.");
}
else
{
ModelState.AddModelError("", "You are already logged in.");
}
return View(model);
}
.
GLOBAL.ASAX
protected void Application_PreRequestHandlerExecute(Object sender, EventArgs e)
{
if (HttpContext.Current.Session != null)
{
if (Session["user"] != (null)) // e.g. this is after an initial logon
{
string sKey = (string)Session["user"];
// replace the last hit with current time
// Accessing the Cache Item extends the Sliding Expiration automatically
string sUser = (string)HttpContext.Current.Cache[sKey];
}
}
}
.
Выход:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult LogOff()
{
UserProfile user = db.UserProfiles.SingleOrDefault(s => s.UserName == User.Identity.Name);
string sKey = user.UserName;
System.Web.HttpContext.Current.Cache.Remove(sKey);
WebSecurity.Logout();
return RedirectToAction("Start", "Home");
}
.
Я использовал термин сеанс и удалил ее. Я не пытаюсь удалить сеанс пользователя, но сделать их авторизацию недействительным с помощью веб-безопасности.
Решение
Нет ничего встроенного для этого. Вам придется разработать некоторую методологию самостоятельно. Вы бы в основном нужны две части:
-
Некоторый способ отслеживания зарегистрированного пользователя в запросах. Это может быть так же просто, как таблица с столбцом имени пользователя, которое вы могли бы использовать, чтобы определить, было ли это конкретное имя пользователя в системе. Вам нужно будет держать это в синхронизации с вашими логинами / выходами, конечно, и вам также нужно Храните идентификатор сеанса для пользователя. Вам понадобится, чтобы следующую часть:
-
Какой-то механизм удаления сеанса из того, что он существует. Это было бы легко, если вы используете SQL Sessions, так как вы можете просто удалить строку из таблицы сеанса таблицы с идентификатором сопоставления. Нет никакого способа сделать это напрямую с ASP.NET, поэтому вам придется напрямую запрашивать базу данных, использовал сохраненную процедуру и т. Д.
Итак, общая идея заключалась в том, что когда пользователь входит в систему, вы записываете их имя пользователя и идентификатор сеанса в таблице или в некоторых других сохраненных магазинах. Когда кто-то пытается войти в систему, вы проверили этот магазин для имени пользователя, который пытается, и если он существует, перейдите к сеансу, который соответствует этому. В следующий раз, когда пользователь с этим сеансом пытается получить доступ к странице, их сеанс Cookie больше не будет соответствовать действительному сеансу, и они будут рассматриваться как если бы они были вытеснены.