35 votes

cookies asp.net, authentification et délais d'expiration de session

J'ai un asp.net site web qui utilise l'authentification par formulaires. Il y a quelques choses que je garde pour les sessions comme nom d'utilisateur, nom d'utilisateur, e-mail, etc.

- Je permettre à l'utilisateur de rester connecté sur le site en définissant une longue date d'expiration du cookie d'authentification. Donc, il est très courant que la session expire lorsque l'utilisateur est toujours authentifiés.

Le problème, je suis en cours d'exécution en est que, parfois, la session de l'utilisateur en temps, mais ils sont encore authentifié. Ainsi, par exemple, l'une de mes pages utilisateur (qui nécessite une authentification) va dire "Bienvenue à Mike" lorsque la session est active, mais une fois qu'il expire, il va dire "Bienvenue [vide]" parce que l'info n'est plus dans la session, mais ils sont encore authentifié.

Quelle est la meilleure façon de gérer cela? Dois-je re-synchroniser les informations de la session quand l'information n'est plus là? Ou dois-je aller les infos sur l'utilisateur (nom d'utilisateur, nom d'utilisateur, e-mail) dans les cookies et ne pas s'inquiéter délais d'expiration de session?

Je ne veux pas définir la durée de la session à quelque chose comme 60 minutes ou plus. Est ce que je veux pour mes utilisateurs d'être en mesure de vous connecter une fois et de ne pas s'inquiéter d'avoir à vous connecter à nouveau jusqu'à ce qu'ils explicitement de déconnexion.

20voto

ScottS Points 5247

Évitez d'utiliser de la session de beaucoup que vous le pouvez, si vous pouvez vous en sortir sans seesion il fait du multi-déploiements de serveur qutie un peu plus facile. Probablement, le Nom et l'email sont faciles candidats pour les cookies. Il est facile de falsifier un cookie, ce nom d'utilisateur peut être pas une bonne idée en fonction de vos besoins de sécurité.

Les cookies d'authentification de formulaires sont cryptées et vous pouvez ajouter des données supplémentaires à ceux des témoins (Voir détails ci-dessous). C'est probablement piratable, mais pas presque aussi facilement qu'un simple cookie.

Voici le code que j'ai utilisé dans le passé légèrement modifiées afin de supprimer certains détails spécifiques. Appelons cela dans le LoggedIn cas de la connexion de contrôle.

void AddUserIDToAuthCookie(string userID)  
{  
  //There is no way to directly set the userdata portion of a FormAuthenticationTicket  
  //without re-writing the login portion of the Login control  
  //  
  //I find it easier to pull the cookie that the Login control inserted out  
  //and create a new cookie with the userdata set  

  HttpCookie authCookie = Response.Cookies[AUTH_COOKIE];
  if(authCookie == null)
  {
    return;
  }

  Response.Cookies.Remove(AUTH_COOKIE);

  FormsAuthenticationTicket oldTicket = FormsAuthentication.Decrypt(authCookie.Value);
  var newTicket =
    new FormsAuthenticationTicket(oldTicket.Version, oldTicket.Name, oldTicket.IssueDate, oldTicket.Expiration,
                                  oldTicket.IsPersistent, userID, oldTicket.CookiePath);

  authCookie.Value = FormsAuthentication.Encrypt(newTicket);

  Response.Cookies.Add(authCookie);
}

Pour info, j'ai copié d'un projet ancien et édité ici pour supprimer certains projets spécifiques bits, donc il peut ne pas compiler, mais ça va être très proche.

Pour obtenir l'ID de votre page web...

FormsAuthenticationTicket ticket = ((FormsIdentity) Page.User.Identity).Ticket;
string id = ticket.UserData;

J'ai utilisé ce mécanisme pour stocker un id qui ne faisait pas partie de la aspnetdb les données de l'utilisateur. Si toutes vos données d'identité est traitée par le aspnetdb, vous pouvez seulement besoin d'accéder à la Page.De l'utilisateur.L'identité de l'objet.

4voto

ccook Points 3190

Personnellement, j'aimerais garder le 20 minutes par défaut et ajouter un "keep alive" des fonctionnalités à votre site. Faire un simple javascript qui interroge, dire hearbeat.aspx, toutes les 5 minutes pour la garder active. Cela permet de prolonger la session et l'authentification sans garder fou les jetons d'authentification.

Il y a quelques exemples (mauvais à mon avis) de la façon de faire. J'ai fini par utiliser quelque chose basé sur http://www.ajaxlines.com/ajax/stuff/article/prevent_session_timeout_in_your_aspnet_ajax_application.php. Au lieu d'utiliser la bibliothèque ajax mais j'ai simplement utilisé un xhtml demande directement. rien n'est vraiment plus nécessaire que chronométré javascript appel à un get sur le rythme cardiaque de la page.

2voto

rajesh pillai Points 5180

Techniquement, en raison de asp.net délai d'expiration de session de votre utilisateur ne doit pas être déconnecté. Cela devrait/est contrôlée par le cookie d'authentification de formulaires.

L'essentiel de l'information relative à l'authentification de l'utilisateur doit être conservé dans les formulaires de ticket d'authentification du USERDATA de la propriété. Cette valeur ne doit pas être conservée en session en session.

Garder uniquement ceux de la valeur dans la session qui est recreatable.

Ainsi, lorsque vous créez des formulaires authetication cookie vous pouvez transmettre toutes les informations essentielles dans le cadre de ce billet.

La petite chose que vous pouvez faire est de tenir le délai d'expiration de session et l'authentification de formulaires de même. Ce sera une bonne pratique de le faire.

Le délai d'expiration de session est automatiquement étendu à chaque requête sur le site.

Alors qu'une authentification par Formulaires étend son temps seulement après que 50% du temps est écoulé.

Voici une info détaillée sur ce.. L'Authentification par formulaires FAQ

Le HttpModule est un bon endroit pour faire bien. De cette façon, votre délai d'attente sera toujours synchronisé, s'il peut y avoir un léger écart.

Également de maintenir le délai d'expiration de session et l'authentification de formulaires de même. Ce sera une bonne pratique de le faire.

Le délai d'expiration de session est automatiquement étendu à chaque requête sur le site.

Alors qu'une authentification par Formulaires étend son temps seulement après que 50% du temps est écoulé.

La chose la plus simple à faire est d'étendre l'authentification de Formulaires de temps dans un HttpModule personnalisé ou de la page de base, ce que jamais votre conception est.

De cette façon, votre délai d'attente sera toujours synchronisé, s'il peut y avoir un léger écart.

0voto

Daniel Schaffer Points 14707

Sans en fait d'essayer quelque chose de moi-même, il y a quelques choses que je voudrais vérifier.

  • L'utilisation d'une méthode/surcharge de la classe FormsAuthentication qui vous permet de définir un cookie persistant. Bien que, à mon humble avis il est conseillé de permettre à vos utilisateurs de choisir de cocher "se souvenir de moi" plutôt que de les forcer à être constamment connecté. Il y a un certain nombre de méthodes qui vous permettent de le faire en se fondant sur ce que le comportement que vous voulez - SetAuthenticationCookie() et RedirectFromLoginPage() sont les premiers qui viennent à l'esprit.

  • Découvrez FormsAuthentication.GetAuthenticationCookie(). Cela va générer un cookie avec le jeton d'authentification, mais pas réellement, ce qui devrait vous permettre de vous changer ce que vous voulez, mais si le FormsAuthentication module est à la recherche d'une valeur spécifique, jouer avec elle risquerait de rompre l'authentification. Vous devrez ensuite ajouter le cookie à la collection de cookies dans la réponse manuellement.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X