2009-03-04 14 views
3

J'ai besoin d'un bouton de déconnexion explicite pour les utilisateurs d'une application Web ASP.NET. J'utilise IIS6 avec l'authentification de base (SSL). Je peux rediriger vers une autre page Web mais le navigateur maintient la session en vie. J'ai fait un googled autour et ai trouvé un moyen de le faire en permettant à un contrôle x actif de communiquer avec IIS et de tuer la session. Je suis dans un environnement restreint qui ne permet pas l'authentification par formulaire et les contrôles x actifs ne sont pas non plus interdits. Quelqu'un d'autre a-t-il eu cette exigence et comment l'avez-vous géré?Bouton de fermeture de session IIS6 Authentification de base ASP.NET

D'accord, c'est ce dont j'avais peur. J'ai vu des réponses similaires sur le net et j'espérais que quelqu'un aurait une façon de le faire. Merci pour votre temps cependant. Je suppose que je peux utiliser javascript pour empêcher le bouton de retour comme le history.back()

Répondre

4

je luttais avec moi-même pendant quelques jours.

Utilisation du spécifique IE « document.execCommand('ClearAuthenticationCache'); » est pas pour tout le monde une bonne option: 1) il vide tous les pouvoirs, ce qui signifie que la volonté de l'utilisateur par exemple également obtenir déconnecté de son gmail ou tout autre site Web où il actuellement authentifié 2) c'est IE seulement;)

J'ai essayé d'utiliser Session.Abandon(), puis rediriger vers mon Default.aspx. Cela seul n'est pas suffisant. Vous devez indiquer explicitement au navigateur que la requête effectuée n'est pas autorisée. Vous pouvez le faire en utilisant quelque chose comme:

response.StatusCode = 401; 
response.Status = "401 Unauthorized"; 
response.AddHeader("WWW-Authenticate", "BASIC Realm=my application name"); 
resp.End(); 

Cela se traduira par les éléments suivants: l'utilisateur clique sur le bouton de fermeture de session ==> il obtiendra la fenêtre de connexion de base. CEPENDANT: s'il appuie sur escape (la boîte de dialogue de connexion disparaît) et qu'il se rafraîchit, le navigateur envoie automagiquement les informations d'identification à nouveau, obligeant l'utilisateur à se connecter, bien qu'il puisse penser qu'il s'est déconnecté.

L'astuce pour résoudre ceci est de toujours cracher un 'domaine' unique. Ensuite, le navigateur ne renvoie PAS les informations d'identification dans le cas décrit ci-dessus. J'ai choisi de cracher la date et l'heure actuelles.

response.StatusCode = 401; 
response.Status = "401 Unauthorized"; 
string realm = "my application name";     
response.AddHeader("WWW-Authenticate", string.Format(@"BASIC Realm={0} ({1})", realm, DateTimeUtils.ConvertToUIDateTime(DateTime.Now))); 
resp.End(); 

Une autre chose que vous devez faire est de dire le navigateur pour ne pas mettre en cache la page:

Response.Cache.SetCacheability(HttpCacheability.NoCache); 
Response.Cache.SetExpires(DateTime.MinValue); 
Response.Cache.SetNoStore(); 

Avec toutes ces choses en place, il travaille (pour moi) dans IE, mais jusqu'à présent je encore n'a pas été en mesure d'empêcher firefox de se connecter à l'utilisateur lorsque l'utilisateur appuie d'abord sur escape (masque la boîte de dialogue de connexion de base), puis de rafraîchir (F5) ou le bouton de retour du navigateur.

0

Avez-vous essayé d'appeler Session.Abandon en réponse à la cliquez sur le bouton?

Modifier:

Il semblerait que c'est un problème de bouton retour classique.

Il y a très peu de choses que vous pouvez faire à propos du bouton de retour. Imaginez que l'utilisateur vient d'ouvrir la page en cours dans une nouvelle fenêtre puis clique sur le bouton logOut, cette page apparaît pour se déconnecter mais cela n'affecte pas immédiatement le contenu de l'autre fenêtre.

Ce n'est que lorsqu'ils tentent de naviguer quelque part dans cette fenêtre qu'il devient évident que leur session a disparu.

De nombreux navigateurs implémentent le bouton de retour d'une manière similaire (bien que non identique). Revenir à la page précédente n'est pas nécessairement une navigation pour un point de vue HTML/HTTP.

+0

Lorsque je clique sur le bouton, je suis toujours authentifié. logOut_Click vide protégé (expéditeur d'objet, EventArgs e) { Session.clear(); Session.Abandon(); ViewState.Clear(); FormsAuthentication.SignOut(); Response.Redirect ("http://www.google.org"); } – willyconnor

2

La méthode Session.Abandon détruit tous les objets stockés dans un objet Session et libère leurs ressources. Si vous n'appelez pas explicitement la méthode Abandon, le serveur détruit ces objets lorsque la session expire.

+0

lorsque je clique sur le bouton, je suis toujours authentifié. protected void logOut_Click (expéditeur d'objet, EventArgs e) { Session.Clear(); Session.Abandon(); ViewState.Clear(); FormsAuthentication.SignOut(); Response.Redirect ("http://www.google.org"); } – willyconnor

+0

Cela ressemble à une version en cache de la page. Si vous essayez de forcer une actualisation à partir du serveur, vous remarquerez que la session a expiré. –

+0

Je devrais également noter que vous pouvez désactiver la mise en cache. Il y a plusieurs questions de stackoverflow qui expliquent comment cela est accompli. –

0

Ceci est une solution pour ce problème qui fonctionne dans IE6 et supérieur.

<asp:LinkButton ID="LinkButton1" runat="server" OnClientClick="logout();">LinkButton</asp:LinkButton> 


<script> 

    function logout() 
    { 
    document.execCommand("ClearAuthenticationCache",false); 
    } 
</script> 

à cet de http://msdn.microsoft.com/en-us/library/bb250510%28VS.85%29.aspx

Team Web à Short Vos lettres de créance, S'il vous plaît

Q: Jerry B. écrit: « Après que l'utilisateur a validé et traité sa demande, je veux maintenant En supposant que cette machine se trouve dans un environnement ouvert où tout le monde peut marcher et nous, je veux lancer un nouveau défi chaque fois qu'un utilisateur accède à un module particulier sur le Web. "

A: Cette fonction est souvent demandé de l'équipe Internet Explorer et les bonnes gens là-bas nous ont donné une façon de le faire dans Internet Explorer 6.0 SP1. Tout ce que vous devez faire est d'appeler la méthode execCommand sur le document, en passant ClearAuthenticationCache comme paramètre de commande, comme ceci:

document.execCommand("ClearAuthenticationCache"); 

Cette commande supprime toutes les informations d'identification dans le cache, de sorte que si l'utilisateur demande une ressource nécessite une authentification, l'invite d'authentification se produit à nouveau.

je mets sur mon bouton de lien de fermeture de session et il fonctionne dans IE6 et plus sp1:

OnClientClick="document.execCommand('ClearAuthenticationCache');" 
Questions connexes