2009-07-25 4 views
1

J'ai rencontré un problème de session étrange. J'ai développé un site Web qui utilise une session pour suivre les informations spécifiques à l'utilisateur afin de déterminer si un utilisateur spécifique a l'autorisation d'accéder à une partie du site Web. J'utilise VSTS 2008 + .Net 3.5 + C# pour développer le site web ASP.Net. Dans ma conception, lorsque j'accède http://mysite/sitemanager, si aucun ID de session n'est disponible, les utilisateurs seront invités à entrer leur nom d'utilisateur et mot de passe (si passé la vérification de mot de passe, l'ID de session disponible sera accordée); Si l'ID de session est disponible, cela signifie que l'utilisateur dispose d'une autorisation de gestion de site et est authentifié. Toutes les fonctions du gestionnaire de site doivent être accessibles à l'utilisateur, c'est-à-dire tous les utilisateurs autorisés à accéder au gestionnaire de site.Http session issue

Le scénario problème est comme ça,

  1. j'accéder http://mysite/sitemanager d'une nouvelle fenêtre IE, depuis que je vous connecter pas avant, et je vous connecter en utilisant mon diplôme et obtenu l'autorisation de gestion du site,
  2. puis Je (ne fermant pas IE) entrez http://www.google.com dans la barre d'adresse de la même fenêtre IE pour remplacer http://mysite/sitemanager, Google apprend,
  3. puis je coller l'adresse http://mysite/sitemanager dans la même fenêtre IE pour accéder, je suis surpris, je ne demande pas la permission de saisir mot de passe.

Des idées quel est le problème? Ce que je veux est à l'étape (3) l'utilisateur devrait être invité à entrer le mot de passe.

Répondre

2

Votre session ne s'est pas terminée simplement parce que vous avez quitté le site. Une session reste active pour sa période de temporisation depuis la dernière interaction avec le site. C'est pourquoi les informations de session existent toujours.

Pour répondre à votre commentaire, vous pouvez terminer une session en appelant Session.Abandon(). Si vous voulez le faire quand quelqu'un quitte le site, je vous suggère de faire un appel ajax sur l'événement client unload de la page qui appellera à son tour Session.Abandon() ou au moins réinitialiser les informations d'identification. Cependant, cela peut être difficile car le déchargement sera appelé même si vous laissez la page pour une autre page dans votre propre site, donc vous devez vérifier cela aussi. Et oui, c'est par conception. Le délai d'attente de session par défaut est de 20 minutes, sauf indication contraire.

+1

Merci SirDemon, 1. voulez-vous dire que c'est par conception, pas mon code bug sur le côté serveur? 2. une solution pour que l'utilisateur de l'étape (3) saisisse son nom d'utilisateur et son mot de passe? – George2

+0

Merci SirDemon, avez-vous un code difficile à partager? J'aime et je veux essayer votre code Ajax. :-) – George2

+0

Voulez-vous dire qu'un événement client de déchargement sera déclenché si j'entre une autre URL (Google dans mon exemple) et que je vais à la nouvelle URL? – George2

2

L'état de session ne sera perdu que si l'utilisateur supprime le cookie de session que votre serveur lui a attribué. Ou l'utilisateur ne fait pas de demande pour une période spécifique (propriété Session.TimeOut). Ou si vous l'abandonnez dans votre code.

+1

Merci çağdaş, 1. voulez-vous dire que c'est par conception, pas mon bug de code côté serveur? 2. Je pense que la session est implémentée dans un cookie, cela signifie que même si j'accède à Google, IE garde toujours mon cookie de session pour http: // mysite/sitemanager? C'est très déroutant puisque je change le domaine (Google) mais IE garde toujours l'information de session pour le domaine précédent (mysite) 3. toute solution pour faire l'utilisateur dans l'étape (3) entrent leur nom d'utilisateur et mot de passe? – George2

+1

1. Oui, c'est par conception. Rien de mal avec votre code. 2. Il s'agit en effet d'un cookie, mais il sera supprimé lors de la fermeture du navigateur. 3. Je ne pense pas que tu puisses faire ça. Aussi, je ne pense pas que vous devriez essayer de mettre en œuvre cela. Imaginez que votre internaute surfe sur votre site en cherchant quelque chose sur Google et qu'il soit déconnecté de votre site à cause de cela. –

+0

Merci çağdaş, mon scénario est l'utilisateur final peut utiliser un ordinateur partagé. Je ne veux pas que le deuxième utilisateur utilise l'autorisation du premier utilisateur. :-) D'autres conseils pour mon problème? Appréciez si n'importe quelle solution pourrait être privée. – George2

1

C'est la façon dont les sessions Web fonctionnent partout. Pour éviter les utilisateurs surprenants; il vaut probablement mieux accepter ce comportement.


Mais si vous voulez vraiment vos utilisateurs de se connecter quand ils cessent d'utiliser votre site, voici comment ...

Plutôt que d'utiliser l'événement unload (qui va être problématique à mettre en œuvre parce qu'il est difficile de dire quand quelqu'un quitte vraiment votre site - et que se passe-t-il si deux fenêtres s'ouvrent sur votre site?), je suggérerais de raccourcir le timeout de la session à 1min, et d'utiliser un keepalive côté client: serveur toutes les quelques secondes (disons, 10) à une URL prédéterminée, ce qui ne fait absolument rien au-delà de garder la session en vie.

Ceci peut être implémenté entièrement sans javascript si nécessaire, via un iframe sur une page avec une balise meta-refresh.Ce serait plus robuste et plus simple en javascript, bien sûr, mais un iframe caché n'est pas trop complexe, pas plus qu'un meta tag. Si la page d'actualisation côté serveur prend en charge l'envoi de 304 Non-modifié, vous disposerez également d'une solution très légère.

Dans votre fichier principal, vous avait toujours inclure quelque chose comme:

<iframe src="keepalive.aspx" width="1" height="1" /> 
<!--and perhaps use css to hide the iframe - but test that!--> 

Et keepalive.aspx vous seriez les suivants:

<meta http-equiv="refresh" content="5" /> 

Enfin, comme l'optimisation de la bande passante , en le code de keepalive.aspx, vous pouvez ajouter un en-tête de réponse Last-Modified et vérifier si le navigateur a envoyé un en-tête de demande If-Not-Modified-Since, et s'il a envoyé un 304 Non-Modified au lieu du document complet . Enfin, si vous êtes de toute façon tributaire de javascript (de nombreuses applications Web basées sur une connexion), vous pouvez simplement utiliser votre ajax framwork favori pour effectuer périodiquement une requête, sans avoir besoin de l'iframe.

+0

Merci Eamon, pourquoi y aura-t-il des problèmes de mise en œuvre en utilisant l'événement de déchargement quand "s'ils ont deux fenêtres ouvertes sur votre site", pourriez-vous me faire savoir plus de détails s'il vous plaît? – George2

+0

Un autre point intéressant est que l'utilisation d'ajax réduira significativement la bande passante et la charge de travail côté serveur par rapport à l'utilisation de l'en-tête de réponse Last-Modified? – George2

+0

Non, 304-Non-modifié et AJAX sont tous deux "presque gratuits" à la fois en termes de CPU et de bande passante; ils peuvent tous deux être implémentés avec des IHttpHandlers personnalisés de faible poids. Vous pourriez probablement facilement servir un million de clients sur une seule case si c'est tout ce qu'il fait - alors ne vous inquiétez pas à ce sujet; vos goulets d'étranglement se trouveront ailleurs (par exemple, dans la session). –