2012-06-08 10 views
10

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:

  1. ¿Es malo o una solución aceptable, al restablecer la cookie en cada petición?
  2. ¿Por qué todavía no funciona? Parece que el nuevo Ticket nunca se renueva.
  3. ¿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,

+0

¿qué versión de framework e IIS está utilizando? –

+0

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 –

+0

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. –

Respuesta

14

Una cookie de autenticación de formularios sólo se renueva después de la mitad de su tiempo de caducidad ha pasado.

De Microsoft:

Si se accede a la página Web antes de la mitad del tiempo de expiración pasa, la fecha de caducidad del billete no se restablecerá. Por ejemplo, si se vuelve a acceder a cualquier página Web a las 5:04 00:00:00 PM, el período de tiempo de espera de cookies y tickets no se restablecerá.

Para evitar un rendimiento comprometida, y para evitar múltiples navegadores advertencias para los usuarios que tienen avisos de las cookies activadas, la cookie se actualiza cuando ha transcurrido más de la mitad del tiempo especificado.

Este puede ser su problema. Si sus clientes acceden a su sitio en la marca de los 9 minutos y no vuelven a acceder a él durante 10 minutos, se les agotará el tiempo de espera. Esto ocurre aunque tenga el tiempo de espera de sesión establecido en 20 minutos.

No es necesario renovar manualmente su ticket como lo hace. Solo necesitas habilitar la expiración deslizante. Si la regla de "la mitad de la hora específica" no le funciona, tendrá que buscar otras soluciones.

+1

Corrimos el mismo problema. Me encontré con el artículo de MS antes de este artículo. El volumen de la información está aquí. https://support.microsoft.com/en-us/kb/910443 – Shrini

Cuestiones relacionadas