J'utilise l'authentification par formulaires avec assez de succès, mais j'ai rencontré un problème étrange. J'ai regardé autour du Web, et n'ai pas trouvé la réponse jusqu'ici. J'utilise un peu de Javascript pour déterminer quand la session actuelle est à 60 secondes de l'expiration du délai, et si c'est le cas - faire apparaître une boîte de dialogue avec un bouton qui, si pressé, étendra le ticket FormsAuthentication en cours.Renouvellement de l'authentification par formulaires - étrange synchronisation
Ceci est le code que j'utilise pour renouveler le ticket. Je rajoute simplement 5 minutes à la date d'expiration actuelle du ticket. Mais quand je produis la nouvelle date d'expiration, c'est toujours moins de 5 minutes; normalement 4 minutes et quelques secondes.
Le code:
string userID = HttpContext.Current.User.Identity.Name;
HttpCookie cookie = FormsAuthentication.GetAuthCookie(userID, true);
FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(cookie.Value);
DateTime NEW_EXPIRY = DateTime.Now.AddMinutes(FormsAuthentication.Timeout.Minutes);
FormsAuthenticationTicket newTicket = new FormsAuthenticationTicket(
ticket.Version,
userID,
DateTime.Now,
NEW_EXPIRY,
ticket.IsPersistent,
ticket.UserData,
ticket.CookiePath);
cookie.Value = FormsAuthentication.Encrypt(newTicket);
if (ticket.IsPersistent) cookie.Expires = newTicket.Expiration;
cookie.Secure = FormsAuthentication.RequireSSL;
HttpContext.Current.Response.Cookies.Add(cookie);
Alors, voici un exemple de sortie des différences de temps:
L'horodatage = maintenant 16/01/2016 14:03:28 ticket expire = 16/01/2016 14:07:49 (TOTAL SECONDS = 261.0857244)
Pourquoi ne réinitialise-t-il pas le délai d'expiration à exactement 14:08:28 ?? Je frappe la tête sur le mur ici ...
Le site s'exécute-t-il localement ou sur un serveur? – stuartd
Je suis sur un membre ici - est-ce que votre code peut prendre un nombre variable de secondes pour obtenir la propriété 'FormsAuthentication.Timeout'? Peut-être en raison de votre configuration IIS? Je suppose que lors de l'exécution, 'DateTime.Now' est lu, puis il faut un certain temps pour initialiser et obtenir le délai, puis cela est ajouté à l'heure maintenant-out-of-date ... – Balah
@stuartd - il est en cours d'exécution localement, mais fait de même sur un serveur – andym0908