Question

J'ai un projet exécutant MVC4 et en utilisant une appartenance simple pour l'authentification. Je veux seulement permettre à un utilisateur de se connecter sur un navigateur. Pour que ce soit transparent à l'utilisateur, j'ai besoin d'un moyen d'avoir un autre navigateur authentifié déconnectez-vous chaque fois qu'un utilisateur se connecte. Cela signifie que si deux utilisateurs tentent d'utiliser le même identifiant, ils se rappelleraient continuellement de faire cela. très improductif.

En ce moment, je l'ai configuré pour permettre uniquement à un utilisateur de se connecter une fois, mais si cet utilisateur devait fermer le navigateur et se déplacer vers un autre ordinateur, ils seraient verrouillés pendant 30 minutes, je peux voir ceci créant un certain nombre de Appels de support inutiles.

Je suppose que je dois suivre une sorte d'identifiant dans une base de données et vérifier pour vous assurer qu'il correspond à chaque demande, sinon ils sont déconnectés. Peut-être, ajouter une sorte de cookie.

Si quelqu'un a une solution élégante à cela, je l'apprécierais!

C'est ce que j'utilise actuellement pour verrouiller les utilisateurs en un seul identifiant:

Connexion:

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

Déconnexion:

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

J'avais utilisé la session à terme et je l'ai supprimé. Je n'essaie pas de supprimer la session de l'utilisateur, mais de faire une autorisation invalide à l'aide de la sécurité Web.

Était-ce utile?

La solution

Il n'y a rien d'intégré pour cela. Vous devrez développer une méthodologie par vous-même. Vous avez essentiellement besoin de deux pièces:

  1. Un moyen de suivre un utilisateur connecté à travers les demandes. Cela pourrait être aussi simple qu'une table avec une colonne Nom d'utilisateur que vous pourriez utiliser pour déterminer si ce nom d'utilisateur particulier a été connecté. Vous auriez besoin de la conserver en synchronisation avec vos connexions / déconnectations, et vous auriez également besoin de Stockez l'ID de session pour l'utilisateur. Vous aurez besoin de cela pour la prochaine pièce:

  2. Un mécanisme de retrait de la session de tout magasin il existe. Cela serait plus facile si vous utilisez des sessions SQL, comme vous pouvez simplement supprimer la ligne de la table de session de table avec l'ID correspondant. Il n'y a aucun moyen de le faire directement avec ASP.NET, vous devez donc utiliser directement la base de données, utilisée une procédure stockée, etc.

  3. Donc, l'idée générale serait que lorsqu'un utilisateur se connecte, vous enregistrez leur nom d'utilisateur et son identifiant de session dans une table ou un autre magasin persisté. Lorsque quelqu'un tente de vous connecter, vous vérifiez ce magasin pour que le nom d'utilisateur en cours de tentative et s'il existe, allez supprimer la session qui correspond à cela. La prochaine fois que l'utilisateur avec cette session tente d'accéder à une page, leur cookie de session ne correspondra plus à une session valide et ils seront traités comme s'ils ont été déconnectés.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top