Pregunta

Tengo un proyecto que ejecuta MVC4 y usando membresía simple para la autenticación. Solo quiero permitir que un usuario inicie sesión en un navegador. Para que esto sea transparente para el usuario, necesito una forma de obtener cualquier otro navegador autenticado. Muy improductivo.

En este momento, me lo tengo configurando solo para permitir que un usuario inicie sesión una vez, pero si ese usuario debía cerrar el navegador y pasar a otra computadora, se cerrarían durante 30 minutos, puedo ver esto creando un número de Llamadas de apoyo innecesarias.

Supongo que necesito rastrear algún tipo de identificador en una base de datos y verificar que se asegure de que coincida con cada solicitud, de lo contrario, se desconectan. Tal vez, agregando algún tipo de cookie.

Si alguien tiene una solución elegante para esto, ¡lo apreciaría!

Esto es lo que estoy usando actualmente para bloquear a los usuarios en un solo inicio de sesión:

Iniciar sesión:

[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];
        }
    }
}

Cerrar sesión:

[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");
}

Había usado la sesión del término y lo he eliminado. No estoy tratando de eliminar la sesión del usuario, pero hacer que su autorización sea válida usando la seguridad web.

¿Fue útil?

Solución

No hay nada incorporado para esto. Tendrías que desarrollar alguna metodología por tu cuenta. Básicamente necesitas dos piezas:

  1. Una forma de rastrear un usuario registrado en las solicitudes. Esto podría ser tan simple como una tabla con una columna de nombre de usuario que podría usar para determinar si se ha iniciado sesión en ese nombre de usuario en particular. Debería mantener esto en sincronización con sus inicios de sesión / cierre de sesión, y también deberías necesitar Almacene el ID de sesión para el usuario. Necesitará eso para la siguiente pieza:

  2. Algún mecanismo de eliminar la sesión de cualquier tienda en la que existe. Esto sería más fácil si está usando sesiones SQL, ya que simplemente podría eliminar la fila de la tabla de la Tabla con la ID de la sesión. No hay forma de hacerlo directamente con ASP.NET, por lo que tendría que consultar directamente la base de datos, usó un procedimiento almacenado, etc.

  3. Entonces, la idea general sería que cuando un usuario inicia sesión, registra su nombre de usuario y su identificación de sesión en una tabla o alguna otra tienda persistida. Cuando alguien intenta iniciar sesión, verificaría esta tienda para el nombre de usuario que se está intentando, y si existe, vaya, elimine la sesión que corresponda a esto. La próxima vez que el usuario con esa sesión intenta acceder a una página, su cookie de sesión ya no coincidirá con una sesión válida y se tratará como si se hayan desconectado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top