2014-10-08 16 views
11

devo codice come questo che viene eseguito quando un utente è autorizzato:cookie scade o timeout di sessione troppo presto

FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(
       1, 
       email, 
       DateTime.Now, 
       DateTime.Now.AddMinutes(120), 
       true, 
       userData); 

     string encTicket = FormsAuthentication.Encrypt(authTicket); 
     HttpCookie faCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encTicket); 
     faCookie.Expires = authTicket.Expiration; 
     Response.Cookies.Add(faCookie); 

Ho quindi reindirizzare a un controller/azione che ha l'attributo Authrize:

[Authorize] 
    public class ProductsController : Controller 
    { 

ho il seguente nel file web.config:

<authentication mode="Forms"> 
     <forms loginUrl="~/Home/Unauthorized" timeout="2880" /> 
    </authentication> 
    <sessionState timeout="120"></sessionState> 

Tuttavia gli utenti si lamentano della sessione timeout o ri dirigere Home/Non autorizzato dopo un paio di minuti di inattività.

cosa potrebbe causare questo, cos'altro dovrei controllare?

+0

Non capisco perché la gente si confonda con il timeout del cookie di autenticazione del modulo e il timeout della sessione del server ... sono 2 diversi compagni di telefono – Shaz

+0

che stai dicendo al tuo server di scadere del tempo utente in 120 minuti e sul altra mano che dice al cookie del browser di conservare il ticket di autenticazione per il 2280 ... ovviamente il ticket scade dopo 120 e l'utente ottiene il timeout ... mentre l'utente mantiene ancora il ticket di autenticazione precedente. – Shaz

+0

Hai definito esplicitamente il tuo 'MachineKey' nel tuo web. config? – Tommy

risposta

16

Un paio di pensieri prima di entrare in una possibile soluzione del perché i vostri accessi sono in scadenza. In primo luogo, il cookie FormsAuthentication e SessionState sono due cose completamente diverse. Puoi avere l'uno o l'altro, o entrambi o nessuno dei due. Di conseguenza, i timeout per questi due elementi non sono correlati.

Il cookie FormsAuthentication è un cookie crittografato che contiene alcune informazioni di base come il nome utente e un valore di scadenza. L'applicazione .NET utilizza questo cookie dopo che un utente si è autenticato per sapere se l'utente è autorizzato per determinate risorse.

Ciò che controlla la crittografia e la decrittografia del cookie FormsAuthentication è lo MachineKey per tale applicazione Web su IIS. MachineKey è un insieme di chiavi utilizzate per crittografare e decrittografare il cookie. Per impostazione predefinita, un'applicazione Web su IIS è impostata su AutoGenerate la chiave della macchina. Ciò significa che all'avvio di un'applicazione viene generata una chiave di macchina casuale. Se un'applicazione si ricicla, si ottiene una nuova chiave macchina. Inoltre, se si esegue l'hosting su un provider condiviso, l'host Web avrà in genere il carico dell'applicazione bilanciato, ovvero ospitato da più di un server. Ciascuno di questi server genererà automaticamente una chiave macchina.

Se l'applicazione Web si trova in uno scenario con bilanciamento del carico, ciascuna macchina della Web farm non può decrittografare il cookie crittografato dell'altro. Questo darà l'impressione di "essere disconnesso". L'esempio di questo è l'accesso sul server web A, quindi una richiesta successiva viene inviata al server Web B. Il server Web B non condivide una chiave macchina con il server web A e non può decodificare il cookie, rimandando l'utente alla pagina di accesso.

La soluzione è definire la sezione MachineKey nel proprio web.config in modo che ogni istanza di IIS utilizzi le stesse chiavi e se il pool di applicazioni ricicla, si ha ancora la stessa chiave del computer.

qui sarebbe un example machine key che si potrebbe inserire nel web.config

<system.web> 
    <machineKey validationKey="EBC1EF196CAC273717C9C96D69D8EF314793FCE2DBB98B261D0C7677C8C7760A3483DDE3B631BC42F7B98B4B13EFB17B97A122056862A92B4E7581F15F4B3551" 
    decryptionKey="5740E6E6A968C76C82BB465275E8C6C9CE08E698CE59A60B0BEB2AA2DA1B9AB3" 
    validation="SHA1" decryption="AES" /> 
</system.web> 

pensieri aggiuntivi sono che il vostro scadenza nel web.config (2880) e quello che sono in realtà l'impostazione della scadenza di essere (120) non corrispondono. Potresti volere che entrambi corrispondano.

+1

buona spiegazione –

0

Se si sta eseguendo un sistema di bilanciamento del carico, si vuole assicurarsi che la web farm stia utilizzando una chiave coerente come indicato dalla risposta di Tommy.

Altre cose da verificare saranno che i settaggi della metabase di IIS per ogni server sono identici. Devono avere lo stesso percorso e ID.

Si vorrà anche guardare fuori sessione di proc (il proprio web.la configurazione è simile a proc), che è soggetta a interruzioni di rete e ricicli di app casuali.

Fondamentalmente un riassunto di questo collegamento. http://msdn.microsoft.com/en-us/library/vstudio/ms178586(v=vs.100).aspx

Se è possibile inviare più configurazioni, se possibile, e fornire maggiori dettagli sulla configurazione dell'ambiente, sarà più facile indirizzarvi verso una direzione più mirata.

0

provare questo: Codice

web.config:

<system.web> 
     <httpRuntime maxRequestLength="40000000" useFullyQualifiedRedirectUrl="true" executionTimeout="600000" /> 
     <authentication mode="Forms"> 
       <forms loginUrl="~/Home/Unauthorized" timeout="2880" cookieless="UseCookies" /> 
      </authentication>  
    </system.web> 

Questo vi aiuterà.

Problemi correlati