8

Ho il codice seguente su una pagina di accesso. Lo sto utilizzando per impostare il timeout di accesso per cliente. In IE8 mi sto imbattendo nel problema che se un utente apre un'altra finestra del browser, quindi si disconnette nella prima finestra, quando si reinseriscono nuovamente vengono rimandati al login dopo una singola pagina (ogni volta). Se non aprono un altro browser, tutto va bene.IE8 e autenticazione moduli ASP.Net hanno esito negativo quando si aprono più browser

Ho trovato un sacco di domande su questo, ma l'unica soluzione che ho trovato che funziona è utilizzare il metodo cookieless (URI).

Ho visto alcuni articoli che dicono di impostare il dominio, cosa che sto facendo, ma che non funziona. Inoltre, ho provato a impostare authticket su persistente e non persistente. Nessuno dei due ha fatto la differenza. Ho visto che una volta che il cookie auth è stato rimosso dalla cartella, non viene ricreato quando effettuo il login.

Se apro la seconda finestra del browser come una "Nuova sessione", non ho alcun problema. (Questo non è pratico in quanto non possiamo addestrare tutti gli utenti dell'applicazione ad aprire finestre aggiuntive in questo modo.)

C'è una soluzione per questo che qualcuno ha trovato che non prevede l'utilizzo dell'approccio URI senza cookie?

int timeoutValue = 20 // This value is actually returned from a method; 

FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(LoginControl.UserName, false, timeoutValue);    
string encryptedTicket = FormsAuthentication.Encrypt(authTicket); 

HttpCookie authCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);     
authCookie.Domain = "my.domain"; 
authCookie.Expires = DateTime.Now.AddMinutes(timeoutValue); 

HttpContext.Current.Response.Cookies.Add(authCookie); 
+0

chiarire: l'utente apre una nuova finestra del browser dall'app? cioè clic con il tasto destro del mouse> apri link in una nuova finestra, essenzialmente estendendo la sessione alla nuova finestra? –

+0

Sì, ma non importa come aprono la seconda finestra. Se avviano un nuovo browser da un collegamento sul desktop, nuova scheda, fare clic con il pulsante destro del mouse. L'unico modo che non causa il problema è "File ... Nuova sessione" – Mikejh99

+0

In realtà, consentitemi di riaffermarlo. Se avvio il browser originale da un collegamento sul desktop, non ho il problema. Penso che questo abbia qualcosa a che fare con il modo in cui IE si sta avviando, con -nomerge o qualcosa del genere. – Mikejh99

risposta

3

Questa "funzione" di Internet Explorer consente di condividere cookie/sessione attraverso le finestre del browser. Quindi la nuova "funzione" per creare una "Nuova sessione" in IE8. Quindi non credo che esista un modo ideale per fermare facilmente questo comportamento.

Altro che andare senza cucinare, naturalmente.

2

So che questa è una vecchia domanda, ma ho combattuto lo stesso problema e credo di avere una soluzione. Ho replicato questi sintomi esatti e sono anche riuscito a eliminarli con successo (almeno finora).

Solo mettendo una scadenza sul cookie se si desidera un ticket di autenticazione persistente si sta eliminando il problema per me.

Ecco il mio metodo così com'è ora:

internal static void CreateAuthenticationCookie(string userName, bool rememberMe, bool expired = false) 
{ 
    int timeout = expired ? -1440 : (rememberMe ? 43200 : 20); // Timeout in minutes, 525600 = 365 days, 1440 = 1 day. 
    FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1, userName, DateTime.Now, DateTime.Now.AddMinutes(timeout), rememberMe, string.Empty); 
    string encrypted = FormsAuthentication.Encrypt(ticket); 
    var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encrypted); 

    if (rememberMe) 
     cookie.Expires = System.DateTime.Now.AddMinutes(timeout); 

    HttpContext.Current.Response.Cookies.Add(cookie); 
} 

Ed ecco come lo chiamo io:

if(createPersistentCookie) 
    CreateAuthenticationCookie(userName, createPersistentCookie); 
else 
    FormsAuthentication.SetAuthCookie(userName, createPersistentCookie); 

mi rendo conto che dal modo in cui sto chiamando, non v'è alcuna necessità per il parametro "ricordami" sul metodo CreateAuthenticationCookie (poiché in questo caso sempre vengo true), ma non l'ho ancora rifattorizzato e ciò dimostra meglio come qualcun altro potrebbe volerlo utilizzare.

Volevo un modo per ottenere facilmente una scadenza di scorrimento se l'utente ha scelto di non "ricordarmi di me", ma se hanno scelto "ricordami" non volevo essere limitato al timeout di 30 minuti del mio non "ricordami" utenti. Il mio scopo era che se qualcuno sta usando un computer pubblico ottengono la scadenza di scorrimento più non mi ricordo, ma se usano un personal computer possono "ricordarmi di me" e non essere vincolati dall'impostazione del timeout nel web.config. Non so che tutto questo si applica alla tua situazione, ma spero che aiuti qualcuno o che la mia metodologia possa attirare alcune critiche costruttive in modo da poter apportare delle modifiche, se necessario.

PS. Ecco la mia rete.impostazioni di configurazione per l'autenticazione dei moduli:

<authentication mode="Forms"> 
     <forms loginUrl="~/Account/LogOn" timeout="30" slidingExpiration="true"/> 
</authentication> 
Problemi correlati