Domanda

Ho un progetto che esegue MVC4 e utilizzando un abbonamento semplice per l'autenticazione. Voglio solo consentire all'utente di accedere su un browser. Per rendere questo trasparente per l'utente, ho bisogno di un modo per disconnettersi da qualsiasi altro browser autenticato ogni volta che un utente accede. Ciò significa che se due utenti stanno cercando di utilizzare lo stesso login, si calmano continuamente a prenderlo via l'altra Molto improduttivo.

In questo momento, ho impostato per consentire a un utente solo di accedere una volta ma se quell'utente dovesse chiudere il browser e passare a un altro computer, sarebbero bloccati per 30 minuti posso vedere questa creazione di un numero di Chiamate di supporto non necessarie.

Assumerei di aver bisogno di tenere traccia di una sorta di identificativo in un database e verificare di accertarti che corrisponda a ciascuna richiesta altrimenti sono disconnessi. Forse, aggiungendo una sorta di cookie.

Se qualcuno ha una soluzione elegante a questo, lo apprezzerei!

Questo è ciò che sto attualmente usando per bloccare gli utenti in un solo accesso:

Login:

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

Logout:

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

Avevo usato la sessione del termine e l'ho rimosso. Non sto cercando di eliminare la sessione dell'utente, ma rendere la loro autorizzazione non valida utilizzando la sicurezza Web.

È stato utile?

Soluzione

Non c'è niente di incorporato per questo. Dovresti sviluppare una metodologia da solo. Fondamentalmente hai bisogno di due pezzi:

    .
  1. un modo per il monitoraggio di un utente registrato su richiesta. Questo potrebbe essere semplice come una tabella con una colonna del nome utente che è possibile utilizzare per determinare se quel particolare nome utente è stato registrato. Dovrai conservare questo in sincronia con i tuoi login / logout, naturalmente, e necessiteresti anche Conservare l'ID della sessione per l'utente. Avrai bisogno di questo per il prossimo pezzo:

  2. Alcuni meccanismi di rimuovere la sessione da qualsiasi negozio in cui esiste. Questo sarebbe più semplice se si utilizzano sessioni SQL, poiché è possibile eliminare semplicemente la riga dalla tabella della sessione della tabella con l'ID corrispondente. Non c'è modo di farlo direttamente con ASP.NET, quindi dovresti interrogare direttamente il database, ha utilizzato una stored procedure, ecc.

  3. Quindi, l'idea generale sarebbe che quando un utente accede, registra il loro nome utente e ID sessione in una tabella o qualche altro negozio persistente. Quando qualcuno tenta di accedere, selezionare questo negozio per il nome utente che viene tentato e, se esiste, vai a eliminare la sessione che corrisponde a questo. La volta successiva, l'utente con quella sessione tenta di accedere a una pagina, il loro cookie di sessione non corrisponderà più a una sessione valida e saranno trattati come se fossero stati disconnessi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top