2012-06-08 17 views
10

Ancora un altro problema con il ticket di autenticazione moduli che scade troppo presto. Ho bisogno di usare la Scadenza scorrevole impostata su true. Ho letto i forum e ho compreso il problema con la perdita di precisione, che il ticket viene aggiornato solo se la richiesta viene effettuata solo dopo metà della scadenza.Biglietto di autenticazione moduli rinnova manualmente:

Il problema: Nel mio webconfig ho come segue:

<authentication mode="Forms"> 
     <forms timeout="20" name="SqlAuthCookie" protection="All" slidingExpiration="true" /> 
    </authentication> 
    <sessionState timeout="20" /> 
    <authorization> 

L'utente deve essere registrato solo fuori e reindirizzato a Login.aspx, solo quando non vi era alcuna richiesta fatta nell'intervallo di 20 minuti. Il problema è che gli utenti stanno facendo richieste e vengono comunque scaricati nella pagina di accesso. Questo non dovrebbe accadere. Quello che pensavo di fare, era di ripristinare manualmente SqlAuthCookie per ogni richiesta.

Di seguito è riportato il mio codice. È chiamato su context.AcquireRequestState.

void context_AcquireRequestState(object sender, EventArgs e) 
    { 
     HttpContext ctx = HttpContext.Current; 
     ResetAuthCookie(ctx); 
    } 

      private void ResetAuthCookie(HttpContext ctx) 
    { 
     HttpCookie authCookie = ctx.Request.Cookies[FormsAuthentication.FormsCookieName]; 
     if (authCookie == null) 
      return; 

     FormsAuthenticationTicket ticketOld = FormsAuthentication.Decrypt(authCookie.Value); 
     if (ticketOld == null) 
      return; 

     if (ticketOld.Expired) 
      return; 

     FormsAuthenticationTicket ticketNew = null; 
     if (FormsAuthentication.SlidingExpiration) 
      ticketNew = FormsAuthentication.RenewTicketIfOld(ticketOld); 

     if (ticketNew != ticketOld) 
      StoreNewCookie(ticketNew, authCookie, ctx); 
    } 

    private void StoreNewCookie(FormsAuthenticationTicket ticketNew, HttpCookie authCookie, HttpContext ctx) 
    { 
     string hash = FormsAuthentication.Encrypt(ticketNew); 
     if (ticketNew.IsPersistent) 
      authCookie.Expires = ticketNew.Expiration; 

     authCookie.Value = hash; 
     authCookie.HttpOnly = true; 

     ctx.Response.Cookies.Add(authCookie); 
    } 

Le mie domande sono:

  1. È sbagliato o una soluzione accettabile, reimpostando il biscotto su ogni richiesta?
  2. Perché non funziona ancora? Sembra che il nuovo biglietto non si rinnovi mai.
  3. Ci sono altre cause possibili, dal momento che gli utenti hanno l'autenticazione dei moduli scaduta troppo presto, che dovrei investigare?

Grazie, saluti,

+0

quale versione di framework e IIS stai utilizzando? –

+0

quadro di riferimento per il progetto è 4.0. La versione di IIS è 7, ma sto testando il server web integrato di Visual Studio 2010 –

+0

Penso che dovresti dare un attributo di dominio nel tag dei moduli. Non è necessario scrivere cookie di rinnovo su ogni richiesta –

risposta

14

Un cookie di autenticazione moduli rinnova solo se stessa dopo la metà è il momento di scadenza è passato.

Da Microsoft:

Se la pagina Web si accede prima della metà del tempo di scadenza passa, il tempo di scadenza biglietto non sarà ripristinato. Ad esempio, se si accede a qualsiasi pagina Web alle 5:04 00:00:00 PM, i cookie e il periodo di timeout del ticket non verranno ripristinati.

Per evitare prestazioni compromesse e per evitare più avvisi del browser per gli utenti con avvisi sui cookie attivati, il cookie è aggiornato a quando è trascorso più della metà del tempo specificato.

Questo potrebbe essere il tuo problema. Se i tuoi clienti accedono al tuo sito al punto 9 minuti e non lo accedono nuovamente per 10 minuti, scadranno il tempo. Ciò si verifica anche se il timeout della sessione è impostato su 20 minuti.

Il rinnovo manuale del biglietto come si fa non è necessario. Hai solo bisogno di scorrere la scadenza abilitata. Se la regola "metà del tempo specifico" non funziona per te, allora dovrai guardare ad altre soluzioni.

+1

Abbiamo eseguito lo stesso problema. Mi sono imbattuto in articolo MS prima di questo articolo. La massa delle informazioni è qui. https://support.microsoft.com/en-us/kb/910443 – Shrini

Problemi correlati