2010-05-17 3 views
3

Je souhaite créer un moyen de rediriger automatiquement les utilisateurs vers Timeout.aspx lorsque leur session expire en raison d'une inactivité. Mon application utilise l'authentification par formulaire et repose fortement sur les panneaux de mise à jour dans la même page aspx pour l'interaction de l'utilisateur, donc je ne veux pas simplement rediriger après l'expiration d'une temporisation au niveau de la page. Pour la même raison, je ne peux pas utiliser « < meta http-equiv = « refresh »/ > »Redirection de délai d'attente de session côté client dans ASP.Net

Ce que je veux faire est de créer un service Web simple ajax avec une méthode appelée IsSessionTimedOut(), que simplement les retours un booléen. J'utiliserai une minuterie javascript pour appeler périodiquement la méthode, et si elle renvoie true, rediriger vers Timeout.aspx. Toutefois, je ne souhaite pas appeler cette méthode pour réinitialiser le délai d'expiration de la session, car la session ne serait jamais interrompue en raison de l'appel de service. Existe-t-il un moyen propre d'éviter ce piège? J'espère qu'il y a une solution facile qui m'a jusqu'ici échappé.

+0

Il n'y a pas une manière propre ou correct pour quelque chose comme ça. Appelez cela un "artefact d'architecture" ... – StingyJack

+0

@all - il existe une manière propre et correcte de gérer ce problème. Il faut juste regarder sous un autre angle. –

Répondre

9

le nœud du problème est que dans les applications AJAX, pour fournir une expérience utilisateur robuste vous devez encombrer votre script client avec ramettes du code vérifiant l'état de chaque appel et déterminant si un échec est dû à une session/ticket périmé. Grâce à une approche proactive, votre script client peut être considérablement simplifié tout en offrant une meilleure expérience utilisateur.

J'ai construit une solution pour ce problème en particulier.

Il permet la session interactive et forme l'audit de vie de ticket sans supplantant la session ou le ticket.

Plusieurs navigateurs/onglets ne posent aucun problème.

Oubliez l'écran solaire; Rappelez-vous: Quand vous faites Ajax, être proactif - Vous devez abandonner une session, une session ne devrait pas vous abandonner ;-)

AsynchronousSessionAuditor 1.0

+0

Cela semble très prometteur. Je n'ai jamais pensé à introduire un HttpModule dans le mix. Merci! –

+0

@Mercury - vous êtes les bienvenus. Je suis heureux que cela puisse être utile. –

+0

@SkySanders Votre projet peut-il fonctionner dans des scénarios Callback & Postback dans un état de session asp.net configuré sur StateServer? Si oui, je souhaite discuter. Meilleures salutations – Myra

0

Est-il vraiment critique que le délai expire lorsque la session côté serveur expire?

Si vous voulez juste forcer les utilisateurs à rafraîchir leurs sessions ou à les temporiser, j'utiliserai window.setTimeout() pour rediriger vers Timeout.aspx après un temps défini. Le codebehind de Timeout.aspx peut appeler Session.Abort() pour tuer la session, ce qui forcera l'utilisateur à se reconnecter s'il veut continuer.

Je pense que cette méthode sera réellement plus précise et fiable que le délai d'attente de session, qui (selon mon expérience) a tendance à varier en fonction de la charge du serveur et d'autres facteurs.

+0

Bonne solution, mais je pense qu'il se décompose si l'utilisateur a plusieurs onglets ou fenêtres ouvertes. Un onglet d'arrière-plan peut entraîner une déconnexion inattendue. –

0

Je pense que si vous activez l'état de session pour votre service Web, puis définissez le SessionStateBehavior à lire uniquement dans votre global.asax si le service Web est en cours d'exécution, vous devriez être bon. Vous devrez le faire tôt dans le cycle de vie.

http://msdn.microsoft.com/en-us/library/system.web.httpcontext.setsessionstatebehavior(v=VS.100).aspx

+0

C'est une bonne idée ... malheureusement, il semble seulement être disponible dans. Net 4.0, et je vise 3.5. –

+0

Je cible .NET 4.6. Avez-vous essayé cela et fonctionne-t-il réellement? –

0

Je pense que vous allez sur ce dans le mauvais sens ... Si vous ne pouvez absolument pas utiliser une simple méta-refresh (de loin la meilleure façon de gérer cela) puis juste traiter les cas où vos méthodes AJAX renvoient des valeurs qui indiquent que votre session a expiré. Pourquoi avez-vous besoin d'un mécanisme supplémentaire pour faire cela? Je ne suis pas familier avec le UpdatePanel ... mais si la mise à jour échoue lorsque votre session est expirée, vous pouvez sûrement renvoyer un message "hey pardner, vous devez vous reconnecter"?

+0

La gestion des valeurs de retour ajax ne suffirait pas, car j'ai besoin que le navigateur redirige automatiquement vers Timeout.aspx après une période d'inactivité, par exemple lorsque l'utilisateur se lève et s'éloigne de l'ordinateur. Dans ce cas, il n'y aurait pas d'appels ajax au serveur. –

2

C'est la meilleure solution que j'ai trouvée jusqu'à présent, mais je suis ouvert à quelque chose de mieux. Fondamentalement, j'ai un timer javascript de 15 minutes qui est réinitialisé avec chaque publication asynchrone. L'inconvénient de cette approche est qu'un deuxième onglet ou une fenêtre ouverte en arrière-plan entraînerait la fin de la session, même si l'utilisateur utilise activement l'application dans une autre fenêtre du navigateur.

Quelque chose de semblable à ceci se trouve sur ma page maître. La dernière ligne de javascript ajoute ma fonction de remise à zéro doit être déclenchée lorsqu'un panneau de mise à jour rafraichit:

 <asp:ScriptManager ID="ScriptManager1" runat="server" ScriptMode="Release" OnAsyncPostBackError="ScriptManager1_AsyncPostBackError"> 
     <Scripts > 
      <asp:ScriptReference Path="~/scripts/jquery/jquery-1.3.2.min.js" /> 
     </Scripts> 
     </asp:ScriptManager> 

     <script type="text/javascript"> 

     var redirectTimer = setTimeout('redirectToLogout()', 900000); 

     function redirectToLogout() { 
      window.location = "/logout.aspx"; 
     } 

     function ResetTimeoutTimer() { 
      clearTimeout(redirectTimer); 
      redirectTimer = setTimeout('redirectToLogout()', 900000); 
     } 


     Sys.WebForms.PageRequestManager.getInstance().add_endRequest(ResetTimeoutTimer); 

     </script> 
Questions connexes