2009-09-02 16 views
8

In una delle app ASP.NET MVC vorremmo disconnettere automaticamente l'utente se si chiude la scheda del browser in cui è stata aperta l'app.Disconnessione Utente quando la scheda del browser è chiusa, ASP.NET MVC

Stiamo usando il seguente codice quando si autentica.

FormsAuthentication.SetAuthCookie (username, false)

A partire da ora, se si chiude la finestra del browser e rilanciarlo, gli utenti sono invitati a autenticarsi di nuovo. Ma vogliamo chiedere agli utenti di autenticarsi di nuovo se chiudono la scheda e tentano di accedere a qualsiasi URL del sito web.

+4

Mi interrogo sulla funzione. Cosa succede se l'utente ha il tuo sito aperto in due schede e ne chiude uno? –

+2

Non esiste un modo affidabile per farlo e non vedo alcun motivo per l'implementazione di tale * funzione *. –

risposta

6

Abbiamo deciso di utilizzare cookie meno autenticazione in modo che il token di autenticazione faccia parte dell'URL. Quando la scheda è chiusa e riaprono il sito Web, verrà chiesto di autenticarsi di nuovo :)

+4

Ho paura che questo potrebbe non essere un buon approccio nell'aspetto SEO. –

+13

Ciò significa che i token di autenticazione verranno salvati in molti più punti, quindi ci si aspetta: molti firewall aziendali e altri filtri registrano l'URL. Anche i registri del tuo sito web mostreranno loro (ciò significa che hai appena dato a qualsiasi amministratore di rete o dipendente del data center con accesso di base ai file la possibilità di impersonare gli utenti copiando l'url dal file di registro IIS/Apache standard) – David

3

Non ho provato io stesso, ma penso che il seguente approccio dovrebbe funzionare:

Sul lato client, è possibile utilizzare l'evento OnUnload del documento per lanciare una funzione JavaScript che avrebbe chiamato il server-side metodo di signout via ajax.

Sul lato server, il metodo action deve chiamare FormsAuthentication.SignOut() e Session.Abandon();

+5

Fai attenzione, tuttavia, poiché l'onunload si attiva anche quando si sta navigando lontano dalla pagina. E per quanto ne so, non c'è alcun modo per verificare se l'utente sta navigando o chiudendo ... – peirix

+0

lo scaricamento viene eseguito prima di passare a ogni pagina del sito. Ma voglio controllare la tabulazione. – Gopinath

+1

Scusa, ho dimenticato che potresti non scrivere un sito web AJAX. Sto caricando tutti i nuovi contenuti tramite le chiamate AJAX (usando un plugin jquery personalizzato), quindi ottengo solo un download quando la scheda o la finestra sono chiuse. –

3

Un browser cancella tutti gli oggetti con ambito Session solo quando è completamente chiuso e non quando viene chiusa una singola scheda.

Un modo potrebbe essere quello di utilizzare un timeout di sessione molto basso e un polling di script sul lato server ogni pochi secondi per colpire un oggetto nella pagina. Ciò prolungherà nuovamente il tempo di sessione. Quindi, se una scheda è chiusa, lo script non può trovare l'oggetto, consentendo in tal modo alla sessione di scadere. Un problema qui è che se la tua app ha un carico piuttosto elevato, la tua app potrebbe fare lo stesso DoS!

1

In realtà non è possibile disconnettere l'utente quando l'utente chiude la scheda del browser. L'unico modo è verificare se l'utente è autenticato quando chiamiamo il metodo LogOn nel Controller.

Questo codice è un esempio di come lo faccio in ASP.Net MVC 3.

public ActionResult LogOn() 
     { 
      if (Request.IsAuthenticated) 
      { 
       FormsAuthentication.SignOut(); 
       return RedirectToAction("Index","ProductManager"); 
      } 
      return View();   
     } 
2

Si può semplicemente utilizzare le variabili di sessione per registrare automaticamente chiunque cercando di tornare alla pagina di destinazione sicura. Crea una singola variabile di sessione (integer o booleana) e nell'evento onclick del tuo pulsante di accesso reimposta lo stato noto dopo aver riconosciuto che l'utente ha una credenziale valida, quindi imposta o incrementa la variabile di sessione nell'evento page_load della pagina in cui ti stai provando mettere al sicuro. Prova questi valori e firma l'utente se sta tentando di tornare alla pagina o non fare nulla se non diversamente. Il codice potrebbe essere simile a questo.

protected void btnLogin_Click(object sender, EventArgs e) 
{ 
     if (IsAuthenticated == true) 
     Session["IsUserLoggedIn"] = (int)0; 
} 

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (HttpContext.Current.User.Identity.IsAuthenticated == true) 
       { 
         if (Session["IsUserLoggedIn"] != null) 
         { 
           int IsUserLoggedIn = (int)Session["IsUserLoggedIn"]; 
           if (IsUserLoggedIn <= 0) 
           { 
             Session["IsUserLoggedIn"] = (int)IsUserLoggedIn + 1; 
           } 
           else 
           { 
             Session["IsUserLoggedIn"] = (int)0; 
             FormsAuthentication.SignOut(); 
             FormsAuthentication.RedirectToLoginPage(); 
           } 
         } 
       } 
       else { Session["IsUserLoggedIn"] = (int)0; } 
     } 
+0

Questo approccio ha un bug grave . Dopo il login se aggiorno la home page in cui è stato implementato il Pagina Page sopra, mi disconnetto. –

Problemi correlati