2016-01-16 1 views
4

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

+0

Le site s'exécute-t-il localement ou sur un serveur? – stuartd

+0

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

+0

@stuartd - il est en cours d'exécution localement, mais fait de même sur un serveur – andym0908

Répondre

0

Ok, donc je ne sais toujours pas pourquoi la valeur d'expiration de l'objet FormsIdentity est incorrecte ... donc ce que j'ai fait est passé la nouvelle expiration réelle valeur (en tant que DateTime) à partir de la méthode de renouvellement, et s'appuyait sur cela. Il semble donc que cette valeur est correcte, et c'est la valeur que je devrais utiliser pour déterminer la valeur du temps réel.

Cela a-t-il même un sens? Je ne sais pas, mais ça marche maintenant!