Otro problema más con el ticket de autenticación de formularios caduca demasiado pronto. Necesito usar el conjunto de caducidad deslizante en verdadero. He leído foros y comprendido el problema con la pérdida de precisión, que el ticket solo se actualiza si la solicitud se realiza después de la mitad del tiempo de caducidad solamente.Renovar manualmente el ticket de autenticación de formularios:
El problema: En mi webconfig que tienen la siguiente manera:
<authentication mode="Forms">
<forms timeout="20" name="SqlAuthCookie" protection="All" slidingExpiration="true" />
</authentication>
<sessionState timeout="20" />
<authorization>
El usuario sólo tiene que iniciar sesión y redirigido a login.aspx, sólo cuando no había solicitado en el intervalo de 20 minutos. El problema es que los usuarios están realizando solicitudes y aún así se lanzan a la página de inicio de sesión. Esto no debería suceder. Lo que pensé hacer fue restablecer SqlAuthCookie manualmente para cada solicitud.
A continuación se muestra mi código. Se invoca en 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);
}
Mis preguntas son:
- ¿Es malo o una solución aceptable, al restablecer la cookie en cada petición?
- ¿Por qué todavía no funciona? Parece que el nuevo Ticket nunca se renueva.
- ¿Hay otras causas posibles, por el hecho de que los usuarios tienen sus formularios de autenticación caducados demasiado pronto, que debo investigar?
Gracias, Saludos,
¿qué versión de framework e IIS está utilizando? –
marco de destino para el proyecto es 4.0. La versión de IIS es 7, pero estoy probando en el servidor web incorporado de visual studio 2010 –
Creo que debería darle un atributo de dominio en la etiqueta de formularios. No es necesario escribir una cookie de renovación en cada solicitud. –