Вопрос

У меня есть проект, запущенный 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");
}
.

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

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

Решение

Нет ничего встроенного для этого. Вам придется разработать некоторую методологию самостоятельно. Вы бы в основном нужны две части:

  1. Некоторый способ отслеживания зарегистрированного пользователя в запросах. Это может быть так же просто, как таблица с столбцом имени пользователя, которое вы могли бы использовать, чтобы определить, было ли это конкретное имя пользователя в системе. Вам нужно будет держать это в синхронизации с вашими логинами / выходами, конечно, и вам также нужно Храните идентификатор сеанса для пользователя. Вам понадобится, чтобы следующую часть:

  2. Какой-то механизм удаления сеанса из того, что он существует. Это было бы легко, если вы используете SQL Sessions, так как вы можете просто удалить строку из таблицы сеанса таблицы с идентификатором сопоставления. Нет никакого способа сделать это напрямую с ASP.NET, поэтому вам придется напрямую запрашивать базу данных, использовал сохраненную процедуру и т. Д.

  3. Итак, общая идея заключалась в том, что когда пользователь входит в систему, вы записываете их имя пользователя и идентификатор сеанса в таблице или в некоторых других сохраненных магазинах. Когда кто-то пытается войти в систему, вы проверили этот магазин для имени пользователя, который пытается, и если он существует, перейдите к сеансу, который соответствует этому. В следующий раз, когда пользователь с этим сеансом пытается получить доступ к странице, их сеанс Cookie больше не будет соответствовать действительному сеансу, и они будут рассматриваться как если бы они были вытеснены.

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