2011-02-03 5 views
8

Cette fonction est appelée lorsque la connexion est réussie. (Je suis très nouveau à cette chose FormAuthentication)FormsAuthenticationTicket expire trop tôt

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); 
} 

Dans le web.config je

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

Je veux que le séjour de l'utilisateur connecté pendant 9 heures, mais il ne fonctionne pas. Ils sont déconnectés après une heure ou deux.

Quelqu'un pourrait-il me dire ce que je manque?

+2

Êtes-vous sûr que c'est le billet et non la session qui est expirant? –

Répondre

1

Avez-vous envisagé de modifier le délai d'attente dans le fichier 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

Oui merci, j'ai 540 comme le délai d'attente, mais cela n'a pas fonctionné. J'ai mis à jour la question. – Aximili

+0

J'ai une pensée. Utilisez-vous SSL? – Victor

+0

Non, pas de SSL ici – Aximili

1

Je l'ai utilisé cet extrait et il fonctionne pour moi, jetez un oeil à ceci:

 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

Il peut se produire en raison du recyclage du pool d'applications.

Le cookie d'authentification est chiffré avec des clés machine. Il semble que ces clés machine soient générées par défaut lors du redémarrage de chaque pool d'applications. Puis votre application est inactive pendant un certain temps (configurée dans les paramètres du pool d'applications), votre pool d'applications est recyclé.

Vous devez donc générer des clés de machine statiques.

Cette question est liée à la vôtre: Can a FormsAuthenticationTicket survive an app pool recycle?

Questions connexes