Comment définir explicitement les sessions asp.net pour qu'elles expirent UNIQUEMENT à la fermeture du navigateur ou à la connexion explicite?

StackOverflow https://stackoverflow.com/questions/93888

  •  01-07-2019
  •  | 
  •  

Question

Par défaut, l’expiration de la session semble être de 20 minutes.

Mise à jour: je ne souhaite pas que la session expire tant que le navigateur n'est pas fermé.

Update2: Voici mon scénario. L'utilisateur se connecte au site. Jeux autour du site. Laisse l'ordinateur pour aller prendre une douche (> 20 min;)). Revient à l'ordinateur et devrait pouvoir jouer. Il ferme le navigateur, ce qui supprime le cookie de session. La prochaine fois qu'il viendra sur le site à partir d'une nouvelle instance de navigateur, il devra se reconnecter.

En PHP, je peux définir session.cookie_lifetime dans php.ini à zéro pour atteindre cet objectif.

Était-ce utile?

La solution

Si vous souhaitez prolonger la session au-delà de 20 minutes, vous modifiez la valeur par défaut à l'aide de l'administrateur IIS ou vous pouvez la définir dans le fichier web.config. Par exemple, pour définir le délai d'expiration sur 60 minutes dans web.config:

<configuration>
  <system.web>
    <sessionState timeout="60" />
    ... other elements omitted ...
  </system.web>
  ... other elements omitted ....
</configuration>

Vous pouvez faire la même chose pour un utilisateur particulier dans le code avec:

Session.Timeout = 60

Quelle que soit la méthode que vous choisissez, vous pouvez modifier le délai en fonction de la valeur que vous jugez raisonnable pour permettre à vos utilisateurs de faire autre chose tout en maintenant leur session.

Il y a bien sûr des inconvénients: pour l'utilisateur, il existe un problème de sécurité: laisser son navigateur sans surveillance et le laisser connecté quand quelqu'un d'autre commence à l'utiliser. Pour vous, il y a le problème de l'utilisation de la mémoire sur le serveur: plus les sessions sont longues, plus vous utiliserez de mémoire à la fois. Que cela compte ou non dépend de la charge de votre serveur.

Si vous ne souhaitez pas évaluer un délai raisonnable, vous devez utiliser l’une des techniques déjà suggérées, qui nécessite l’exécution de JavaScript dans le navigateur pour envoyer une requête ping au serveur à intervalles réguliers et / ou abandonner la session lorsqu’un la page est déchargée (à condition que l'utilisateur ne se rende pas sur une autre page de votre site, bien sûr).

Autres conseils

Vous pouvez définir un délai d’expiration de session court (5 minutes, par exemple), puis demander à la page d’interroger le serveur périodiquement, soit en utilisant Javascript pour déclencher une requête XmlHttpRequest toutes les 2 minutes, soit en laissant un iframe masqué pointant vers une page qui se rafraîchit toutes les 2 minutes.

Une fois le navigateur fermé, la session expirera assez rapidement car il n'y aurait plus rien pour la garder en vie.

Ce n'est pas un nouveau problème, il existe plusieurs scénarios à gérer si vous voulez comprendre toutes les manières dont une session peut se terminer, voici quelques exemples généraux:

  1. L'instance ou l'onglet du navigateur est fermé.
  2. L'utilisateur navigue hors de votre site Web à l'aide de la même instance de navigateur ou du même onglet.
  3. Les utilisateurs perdent leur connexion à Internet (ceci pourrait inclure une panne de courant affectant leur ordinateur ou tout autre moyen).
  4. L'utilisateur s'éloigne de l'ordinateur (ou, d'une autre manière, cesse d'interagir avec votre site).
  5. Le serveur est hors tension / redémarre.

Les deux premiers éléments doivent être gérés par le client qui envoie des informations au serveur. En règle générale, javascript est utilisé pour accéder à une page de déconnexion qui expire rapidement la session.

Les troisième et quatrième éléments sont normalement gérés en définissant le délai d’exécution de l’état de la session (quelle que soit la durée). Le temps que vous utilisez est basé sur la recherche d’une valeur permettant aux utilisateurs d’utiliser votre site sans surcharger le serveur. Une règle approximative peut être 30 minutes plus ou moins 10 minutes. Cependant, la valeur appropriée devrait probablement faire l’objet d’un autre message.

Le cinquième élément est traité en fonction de la manière dont vous stockez vos sessions. Les sessions stockées dans l'état ne survivront pas au redémarrage car elles sont dans le bélier de l'ordinateur. Les sessions stockées dans une base de données ou un cookie survivraient au redémarrage. Vous pouvez gérer cela à votre guise.

Dans mon expérience limitée, lorsque ce problème se posait auparavant, il a été déterminé qu'il suffisait de définir le délai d'expiration de la session sur une valeur acceptable. Cependant, cela peut être fait.

C'est la valeur par défaut. Lorsque vous avez une session, la session est stockée dans un "cookie de session", qui est automatiquement supprimé à la fermeture du navigateur.

Si vous souhaitez avoir la session entre deux sessions de navigateur, vous devez définir le cookie.Expired à une date dans la fonctionnalité.

Parce que la session dont vous parlez est stockée par le serveur, et non le client, vous ne pouvez pas faire ce que vous voulez.

Mais n'utilisez pas de session côté serveur ASP.NET et utilisez uniquement des cookies.

Malheureusement, en raison de la nature explicite du Web et du fait qu’il n’existe aucun lien permanent entre un serveur de site Web et le navigateur de l’utilisateur, il est impossible de savoir quand un utilisateur a fermé son navigateur. Il existe des événements et du code JavaScript que vous pouvez implémenter (par exemple, onunload) et que vous pouvez utiliser pour rappeler au serveur des appels susceptibles de «tuer» une session - Session.Abandon ();

Vous pouvez définir le délai d'expiration d'une session dans web.config. N'oubliez pas que ce délai est basé sur le temps écoulé depuis le dernier appel du serveur par le navigateur de l'utilisateur.

La date d'expiration du navigateur n'a pas été ajoutée.

Il n'y a aucun moyen de vider explicitement la session si vous ne communiquez pas d'une manière ou d'une autre entre le client et le serveur au moment de la fermeture de la fenêtre; recevoir un message de fermeture de fenêtre.

Mon Javascript n'est pas assez bon pour vous donner les instructions à suivre pour le faire; désolé: (

Vous ne pouvez pas, car vous ne pouvez pas contrôler la réponse du client HTML.

Pourquoi avez-vous besoin de le faire? Tant que personne ne pourra utiliser la session, elle expirera au bout de 20 minutes. Si les ressources sont importantes, définissez une expiration de session plus agressive (la plupart des sociétés d'hébergement l'ont fait, ce qui est terriblement ennuyeux) ou utilisez moins d'objets en session. Essayez d'éviter tout type d'objet, mais stockez simplement les clés pour les récupérer. Cette conception est très importante car elle vous aide à redimensionner votre session sur un serveur d'état lorsque vous êtes gros.

Corrigez-moi si je comprends mal l'intention de votre question, mais la question sous-jacente semble moins porter sur la façon de forcer la session à se terminer lorsqu'un utilisateur ferme le navigateur et davantage sur la façon d'empêcher une session de se terminer jusqu'à ce que le navigateur est fermé.

Je pense que la vraie solution consiste à réévaluer ce que vous utilisez pour faire des sessions. Si vous les utilisez pour maintenir l’état, je suis d’accord avec les autres réponses pour dire que vous pourriez ne pas avoir de chance.

Cependant, une approche préférée consiste à utiliser un mécanisme d'état persistant ayant la même étendue que la session du navigateur, tel qu'un cookie qui expire à la fermeture du navigateur. Ce cookie peut contenir juste assez d’informations pour relancer la session sur le serveur si elle expire depuis la dernière demande. Combinée à un délai d’expiration de session relativement court (5 à 10 minutes), je pense que cela vous donne le meilleur équilibre entre l’utilisation des ressources du serveur et le fait de ne pas obliger l’utilisateur à continuellement "redémarrer". le site.

Oh, vous avez réécrit la question.

Celui-ci est tout à fait réalisable tant que le javascript est actif. Utilisez n'importe quel ajax chronométré. Vérifiez avec la bibliothèque de prototypes http://www.prototypejs.org PeriodicalExecutor ou jQuery avec le plug-in ajax + timer. Configurez une page fictive que votre exécuteur appellera de temps en temps pour que votre session soit toujours active, sauf s'il se déconnecte (tuez le minuteur ajax dans le même temps) ou fermez le navigateur (ce qui signifie que l'exécuteur est quand même tué)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top