2011-02-03 15 views
8

Esta es mi función que se llama cuando un inicio de sesión es exitoso. (Soy muy nuevo en esto FormAuthentication)FormsAuthenticationTicket caduca demasiado pronto

public static void CreateLoginCookie(User u) 
{ 
    FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(u.Id.ToString(), true, 9*60); 
    string encryptedTicket = FormsAuthentication.Encrypt(ticket); 
    HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket) { Expires = DateTime.Now.AddHours(9) }; 
    HttpContext.Current.Response.Cookies.Add(cookie); 
} 

En el web.config tengo

<authentication mode="Forms"> 
    <forms loginUrl="~/Default/Login" timeout="540" /> 
</authentication> 

quiero que el usuario ha iniciado sesión en la estancia durante 9 horas, pero no funciona. Se desconectan después de una hora o dos.

¿Podría alguien decirme qué me falta?

+2

¿Seguro que es el billete y no la sesión que se expira? –

Respuesta

1

¿Ha pensado en modificar el tiempo de espera en el archivo web.config?

<forms 
    name="name" 
    loginUrl="URL" 
    defaultUrl="URL" 
    protection="[All|None|Encryption|Validation]" 
    timeout="[MM]" 
    path="path" 
    requireSSL="[true|false]" 
    slidingExpiration="[true|false]"> 
    enableCrossAppRedirects="[true|false]" 
    cookieless="[UseUri|UseCookies|AutoDetect|UseDeviceProfile]" 
    domain="domain name" 
    ticketCompatibilityMode="[Framework20|Framework40]"> 
    <credentials>...</credentials> 
</forms> 
+0

Sí, gracias, tengo 540 como tiempo de espera pero no funcionó. Actualicé la pregunta. – Aximili

+0

Tengo un pensamiento. ¿Estás usando SSL? – Victor

+0

No, no SSL aquí – Aximili

1

He usado este fragmento y funciona para mí, echar un vistazo a esto:

 FormsAuthenticationTicket Ticket = new FormsAuthenticationTicket( 
               1,          // Ticket version 
               username,         // Username associated with ticket 
               DateTime.Now,        // Date/time issued 
               DateTime.Now.AddDays(1),     // Date/time to expire 
               isPersistent,        // "true" for a persistent user cookie 
               dataStore,        // User-data, in this case the roles 
               FormsAuthentication.FormsCookiePath);  // Path cookie valid for 

     // Encrypt the cookie using the machine key for secure transport 
     string Hash = FormsAuthentication.Encrypt(Ticket); 
     HttpCookie Cookie = new HttpCookie(FormsAuthentication.FormsCookieName, Hash); 

     // Set the cookie's expiration time to the tickets expiration time 
     if (Ticket.IsPersistent) 
      Cookie.Expires = Ticket.Expiration; 
3

Puede suceder debido Grupo de aplicaciones de reciclaje.

La cookie de autenticación está encriptada con las teclas de la máquina. Parece que, de forma predeterminada, estas claves de máquina se generan en cada reinicio del grupo de aplicaciones. Luego, su aplicación estará inactiva por algún tiempo (configurada en la configuración del grupo de aplicaciones), su grupo de aplicaciones se reciclará.

Por lo tanto, debe generar claves de máquina estáticas.

Esta pregunta se relaciona con la suya: Can a FormsAuthenticationTicket survive an app pool recycle?

Cuestiones relacionadas