2010-04-21 7 views
26

Je cherche une solution pour que l'utilisateur utilise le bouton de retour du navigateur pour accéder à la page précédente une fois déconnecté.Authentification et déconnexion de l'authentification ASP.NET avec le bouton de retour du navigateur

J'ai une application Web construite dans asp.net et utilisant un fournisseur d'appartenances personnalisé pour l'authentification et l'autorisation. Tout fonctionne bien sauf lorsque l'utilisateur clique sur le lien de déconnexion pour se déconnecter de l'application et rediriger vers une page de garde par défaut, si l'utilisation clique sur le bouton BACK de son navigateur, il retournera à l'endroit où il était auparavant et les données apparaîtront toujours.

Bien sûr, ils ne peuvent rien faire sur cette page, cliquez sur n'importe quel lien, ils seront redirigés vers une page de connexion. Mais l'affichage de ces informations rend beaucoup d'utilisateurs confus. Je me demande simplement si je peux effacer l'historique du navigateur de sorte que l'utilisation ne puisse pas revenir en arrière, ou quand ils cliquent sur le bouton de retour et les redirigent vers la page de connexion.

grâce

+1

+1 pour une bonne question. +1 pour une bonne question à peine battu -1 pour une mauvaise conclusion. –

+0

qui était hors de ma paresse ~ va essayer à nouveau – Eatdoku

Répondre

21

se soucier de l'historique du navigateur et le bouton retour va vous donner des maux de tête et des verrues génitales. Il existe des installations intégrées pour gérer ce problème. Votre lien/bouton de déconnexion doit pointer vers une page contenant ce code, ainsi que tout ce que vous voulez.

[vb.net]

Imports System.Web.Security 

Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) _ 
Handles MyBase.Load 
    Session.Abandon() 
    FormsAuthentication.SignOut() 
End Sub 

[C#]

using System.Web.Security; 

private void Page_Load(object sender, System.EventArgs e) 
{ 
    // Put user code to initialize the page here 
    Session.Abandon(); 
    FormsAuthentication.SignOut(); 
} 

code provient de ce page et est valide, mais la page est difficile sur les yeux.

Une bonne question/réponse concernant le comportement du bouton-poussoir peut être trouvée here.

Mise à jour:

conformément à la conversation que j'ai avec Matthew, la désactivation de la mise en cache sur des pages individuelles qui sont sensibles ou volitile peut être fait avec un code tel que suit:

Response.Cache.SetExpires(DateTime.UtcNow.AddMinutes(-1)); 
Response.Cache.SetCacheability(HttpCacheability.NoCache); 
Response.Cache.SetNoStore(); 

Je suis curieux de savoir si cela fonctionne pour vous comme pour moi.

+3

Ce n'est pas la réponse à cette question. – nima

+0

Est-ce que cela désactivera également la mise en cache de css/js? Merci: D –

+0

@Sky Sanders - Attendez, n'avez-vous pas dit à quelqu'un dans une réponse ci-dessous que Response.Cache.SetCacheability (HttpCacheability.NoCache) était lui "perdre l'esprit?". Quoi qu'il en soit, j'aime toujours votre réponse – deebs

3

Vous pouvez utiliser javascript pour désactiver le bouton de retour (généralement en envoyant l'utilisateur à une page qui redirige vers une autre page, de sorte que le fait de cliquer vous renvoie à nouveau). Un utilisateur persistant peut toujours faire deux pas en arrière dans l'historique et passer la boucle.

Cette page se trouve dans le cache du navigateur. Vous pouvez demander au navigateur de ne rien mettre en cache, mais cela gâchera les performances, parfois de façon dramatique, donc je ne le recommanderais pas.

+1

Matthew, pourquoi suggérer un hack quand il y a des fonctionnalités intégrées pour gérer le problème? –

+0

Session.Abandon et FormsAuthentication.SignOut n'indique pas au navigateur d'effacer son cache (et le navigateur et les proxies intermédiaires n'ont pas à respecter un en-tête de non-cache) Les pages mises en cache peuvent toujours être chargées, et si un La requête est faite à partir d'une page dans le cache du client après que la session est niée, sans indiquer le résultat, probablement NullReferenceExceptions lorsque la page commence à vérifier les variables de session (et une redirection vers la page de connexion). – MatthewMartin

+0

Ensuite, no-cache doit être défini de façon discrète sur les pages sensibles ou volatiles qui ne doivent pas être ressuscitées. Vous ne pouvez pas contrôler le client et essayez simplement d'ajouter de la complexité. Si elles veulent sauvegarder 3 clics dans une «page a expiré» après la déconnexion ..?!?! plus de pouvoir pour eux. En tout cas, je ne te harcèle pas juste en disant ... p.s. utilisez @sky pour m'assurer que j'obtiens des réponses aux commentaires. –

-3

En fait, j'ai trouvé une solution, j'ai ajouté l'extrait suivant à la méthode de chargement de la page maître.

Page.Response.Cache.SetCacheability(HttpCacheability.NoCache); 

Merci pour la réponse :) de toute façon

+7

Hey, tourne-toi, je pense que tu as perdu l'esprit quelque part ... ;-p C'est comme essayer de réparer une montre avec un marteau. Pour le dire gentiment, cela qualifie pour un DWTF. S'il vous plaît reconsidérer. –

+0

bien !! ... laissez-moi essayer encore une fois :) – Eatdoku

0

Vous pouvez essayer d'utiliser le HttpResponse.Propriété cache si cela pouvait aider:

Response.Cache.SetExpires(DateTime.Now.AddSeconds(60)); 
Response.Cache.SetCacheability(HttpCacheability.Public); 
Response.Cache.SetValidUntilExpires(false); 
Response.Cache.VaryByParams["Category"] = true; 

if (Response.Cache.VaryByParams["Category"]) 
{ 
//… 
} 

Ou pourrait pourrait bloquer la mise en cache de la page tout à fait avec HttpResponse.CacheControl, mais son été dépréciée en faveur de la propriété Cache ci-dessus:

Response.CacheControl = “No-Cache”; 

ou vous pouvez vraiment aller les noix et tout faire à la main:

Response.ClearHeaders(); 
Response.AppendHeader(“Cache-Control”, “no-cache”); //HTTP 1.1 
Response.AppendHeader(“Cache-Control”, “private”); // HTTP 1.1 
Response.AppendHeader(“Cache-Control”, “no-store”); // HTTP 1.1 
Response.AppendHeader(“Cache-Control”, “must-revalidate”); // HTTP 1.1 
Response.AppendHeader(“Cache-Control”, “max-stale=0″); // HTTP 1.1 
Response.AppendHeader(“Cache-Control”, “post-check=0″); // HTTP 1.1 
Response.AppendHeader(“Cache-Control”, “pre-check=0″); // HTTP 1.1 
Response.AppendHeader(“Pragma”, “no-cache”); // HTTP 1.1 
Response.AppendHeader(“Keep-Alive”, “timeout=3, max=993″); // HTTP 1.1 
Response.AppendHeader(“Expires”, “Mon, 26 Jul 1997 05:00:00 GMT”); // HTTP 1.1 

Reference

1

Ce code est très utile

Response.Cache.SetCacheability(HttpCacheability.NoCache); 

mis ce code que sur l'événement de charge, sur le pagen maître en cas, mais il ne fonctionne que pour IE, pour IE et Firefox je

Response.Cache.SetCacheability(HttpCacheability.NoCache); 
Response.Cache.SetNoStore(); 
1

Your Answer

Une solution à cela est d'ajouter ce qui suit code javascript à la section de la page logout.aspx:

<script type="text/javascript"> 
window.history.forward(1); 
</script> 

Ce code javascript redirigera l'utilisateur si l'utilisateur accède à la page de déconnexion en appuyant sur le bouton de retour.

Si vous devez vous assurer que l'utilisateur n'a aucun moyen de revenir aux pages après déconnectent, vous devez demander au navigateur de ne pas mettre en cache l'une des pages en incluant un code similaire à ce qui suit sur chaque page:

Response.Cache.SetExpires(DateTime.UtcNow.AddMinutes(-1)); 
Response.Cache.SetCacheability(HttpCacheability.NoCache); 
Response.Cache.SetNoStore(); 
Questions connexes