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

j'ai un asp.net site web qui utilise l'authentification des formulaires. Il y a quelques choses que je garde dans les sessions comme le nom d'utilisateur, l'identifiant d'utilisateur, l'email, etc.

j'autorise l'utilisateur à rester connecté sur le site en fixant une longue date d'expiration sur le cookie d'authentification. Il est donc très courant que la session expire alors que l'utilisateur est encore authentifié.

le problème que je rencontre, c'est que parfois la session de l'utilisateur s'écoule, mais ils sont toujours authentifiés. Donc, pour par exemple, une de mes pages d'utilisateur (qui nécessite une authentification) dira "welcome Mike" lorsque leur session est active, mais une fois qu'elle expire, elle dira "Welcome [blank]" parce que l'information n'est plus dans la session, pourtant ils sont toujours authentifiés.

Quelle est la meilleure façon de gérer cela? Est-ce que je dois resyncer l'info de la session lorsque l'info n'est plus là? Ou devrais-je déplacer les informations utilisateur (nom d'utilisateur, nom d'utilisateur, e-mail) dans les cookies et ne pas m'inquiéter des temps morts de la session?

je n'ai pas souhaitez définir la durée de la session à quelque chose comme 60 minutes ou plus. ce que je veux, c'est que mes utilisateurs puissent se connecter une fois et ne pas s'inquiéter d'avoir à se connecter à nouveau jusqu'à ce qu'ils se déconnectent explicitement.

31
demandé sur danifo 2009-01-18 06:55:28

5 réponses

évitez d'utiliser session autant que vous le pouvez, si vous pouvez vous en sortir sans seesion, il rend multi-serveurs déploiements qutie un peu plus facile. Probablement, le nom et l'email sont des candidats faciles pour les cookies. Il est facile de simuler un cookie, donc userID peut ne pas être une bonne idée en fonction de vos besoins de sécurité.

Voici le code que j'ai utilisé dans le passé légèrement modifiées afin de supprimer certains détails spécifiques. Appelez ceci dans L'événement LoggedIn du contrôle de connexion.

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 obtenir L'ID dans 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 utilisateur données. Si toutes vos données d'identité sont traitées par aspnetdb, vous n'aurez peut-être qu'à accéder à la Page.Utilisateur.L'identité de l'objet.

17
répondu ScottS 2009-01-18 06:15:43

personnellement, je garderais le défaut de 20 minutes et ajouterais une fonctionnalité "keep alive" à votre site. Faites un javascript simple qui scrute, disons heartbeat.aspx, toutes les 5 minutes pour garder la session en vie. Cela permettra d'étendre la session et l'authentification sans garder les clés d'authentification crazy.

Il y a quelques exemples (mauvais à mon avis) de comment faire cela. J'ai fini par utiliser quelque chose basé sur séance D'AjaxLines temps d'arrêt prévention. Au lieu d'utiliser la ajax library, cependant, j'ai simplement utilisé une requête xhtml directement. Rien n'est vraiment nécessaire plus qu'un appel javascript chronométré à un GET sur la page heartbeat.

4
répondu ccook 2017-12-20 15:31:52

techniquement due à asp.net durée de la session votre utilisateur ne doit pas être déconnecté. Ceci devrait/est contrôlé par le cookie d'authentification forms.

toutes les informations essentielles relatives à l'authentification de l'utilisateur doivent être conservées dans la propriété USERDATA de forms authentication ticket. Cette valeur ne doit pas être conservée en session en session.

ne conservez que la valeur en session qui est susceptible de restauration.

Ainsi, lorsque vous créez l'authentification des formulaires cookie vous pouvez passer toutes les informations essentielles dans le cadre du billet.

la chose rapide que vous pouvez faire est de garder le temps d'arrêt de la session et les formes d'authentification identiques. Ce sera une bonne pratique de le faire.

le délai de session est automatiquement prolongé avec chaque requête sur le site.

alors qu'une authentification Forms ne prolonge son temps qu'après 50% du temps écoulé.

Voici une information détaillée à ce sujet.. Formulaires Authentification FAQ

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

aussi garder le même délai d'expiration de la session et des formulaires d'authentification. Ce sera une bonne pratique de le faire.

le délai de session est automatiquement prolongé avec chaque requête sur le site.

alors qu'une authentification Forms ne prolonge son temps qu'après 50% du temps a écoulé.

la chose la plus simple à faire est de prolonger le temps D'authentification des formulaires dans une page HttpModule ou de base personnalisée, quelle que soit votre conception.

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

1
répondu rajesh pillai 2013-07-25 14:15:30

sans réellement essayer quoi que ce soit moi-même, il y a quelques choses que je vérifierais.

  • Utiliser une méthode/surcharge de la classe FormsAuthentication qui vous permet de définir un cookie persistant. Bien que, IMHO il est de la courtoisie commune de permettre à vos utilisateurs de choisir de cocher une case "Se souvenir de moi" plutôt que de les forcer à être connecté de manière persistante. Il y a un certain nombre de méthodes qui vous permettent de faire ceci basé sur le comportement que vous voulez - Setathenticationcookie() et RedirectFromLoginPage() sont les premiers qui viennent à l'esprit.

  • découvrez FormsAuthentication.GetAuthenticationCookie (). Cela générera un cookie HTTP avec le token d'authentification, mais ne le définira pas, ce qui est devrait vous permet de changer ce que vous voulez - bien que si le module FormsAuthentication est à la recherche d'une valeur spécifique, le toucher pourrait briser l'authentification. Vous devrez alors ajouter le cookie à la collection de cookies dans le réponse manuellement.

0
répondu Daniel Schaffer 2009-01-18 04:42:18

ma méthode préférée est d'utiliser une session comme cache. c'est-à-dire, essayer de lire à partir de la session, si la valeur est là, puis la retourner, si elle ne l'est pas, la lire à partir de persistence store (base de données, etc), la mettre dans la session et la retourner.

pour simplifier cela, créez une classe, ajoutez une propriété pour chaque variable dans session, et stockez une instance de la classe dans session. Puis créer une méthode statique pour obtenir une instance de la classe. J'ajouterai un exemple plus tard si je le pouvais.

0
répondu Mahmoodvcs 2014-10-10 06:29:45