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:
- È sbagliato o una soluzione accettabile, reimpostando il biscotto su ogni richiesta?
- Perché non funziona ancora? Sembra che il nuovo biglietto non si rinnovi mai.
- Ci sono altre cause possibili, dal momento che gli utenti hanno l'autenticazione dei moduli scaduta troppo presto, che dovrei investigare?
Grazie, saluti,
quale versione di framework e IIS stai utilizzando? –
quadro di riferimento per il progetto è 4.0. La versione di IIS è 7, ma sto testando il server web integrato di Visual Studio 2010 –
Penso che dovresti dare un attributo di dominio nel tag dei moduli. Non è necessario scrivere cookie di rinnovo su ogni richiesta –