2013-11-26 16 views
5

Ho SignalR installato e funzionante sulla mia applicazione MVC 4 che utilizza l'autenticazione basata su form. Ho il timeout del cookie con scadenza scorrevole impostata su 20 minuti.Eccezione SignalR "Identità utente non riconosciuta L'identità dell'utente non può cambiare durante una connessione SignalR attiva."

Ho una funzione javascript che viene eseguita su un timer in modo che dopo 20 minuti e 1 secondo, si aggiorna la pagina e l'utente viene reindirizzato alla pagina di accesso. È importante che lo faccia per ragioni di sicurezza e funzioni bene.

Il mio problema è che SignalR lancia un'eccezione InvalidOperation perché l'identità dell'utente è cambiata. Capisco perché lo sta facendo ma non sono sicuro di come evitarlo.

Ho provato a chiamare $ .connection.hub.stop(); prima di ricaricare la pagina ma non funziona. Ho provato a chiamarlo 5 secondi prima che il cookie scada, ma questo solo riattiva la sessione.

Tutte le idee sarebbe apprezzato!

Grazie John

risposta

2

ero in corrispondenza con David Fowler (l'autore di SignalR) su Github e lui ha detto che non c'era un modo semplice di risolvere questo.

Per aggirare il problema, ho implementato un'azione del controller Silent Logout, che uccide semplicemente la sessione degli utenti.

[HttpPost] 
    [AjaxOnly] 
    public ActionResult SilentLogOff() 
    { 
     _unitOfWork.WebSecurity.Logout(); 

     return Json(new 
     { 
      IsSuccess = true, 
     }); 
    } 

Ho quindi regolato il timer JS a 10 secondi dal timeout di autenticazione di Forms. Quando scade, interrompe la connessione dell'hub SignalR, esegue un POST all'azione SilentLogout e quindi ricarica la pagina.

SetLogoutTimer: function() { 

    var formsTimeoutValue = $("#hdnRefreshTimeout").val(); 

    clearTimeout("formsTimeoutTimer"); 

    var formsTimeoutTimer = setTimeout(function() { 
     $.connection.hub.stop(); 

     AppName.Authenticated.SilentLogoutUser(); 

    }, formsTimeoutValue); 
} 

SilentLogoutUser: function() { 
    var url = $("#logout a").attr("data-bind-silent-url"); 
    $.ajax({ 
     type: "POST", 
     url: url, 
     success: function (response) { 
      if (response.IsSuccess === true) { 
       window.location.reload(true); 
      } 

     } 
    }); 
} 

Il risultato è il comportamento corretto in quanto non esiste alcuna eccezione SignalR, e l'utente viene reindirizzato alla pagina precedente erano sulla dopo la ri-autenticazione.

+0

Questo ha davvero risolto il problema? Potresti postare del codice? – WebDever

+0

Aggiunti esempi di codice Hi. Funziona comunque per me. Questa è una soluzione javascript, quindi non si adatta a tutti gli scenari. Nella mia applicazione, l'utente non può accedere a meno che javascript sia abilitato. –