FormsAuthentication.SignOut() ne permet pas de déconnecter l'utilisateur
Brisé ma tête contre c'est un peu trop long. Comment puis-je empêcher un utilisateur de la navigation dans un site de pages après avoir été connecté à l'aide de FormsAuthentication.SignOut? Je m'attends à ce faire:
FormsAuthentication.SignOut();
Session.Abandon();
FormsAuthentication.RedirectToLoginPage();
Mais il ne le fait pas. Si je tape dans l'URL directement, je peux toujours naviguer à la page. Je n'ai pas utilisé le rouleau de-votre-propre sécurité dans un moment donc j'oublie pourquoi cela ne fonctionne pas.
- Ce code est très bien comme il est ... en cliquant sur l'arrière dans le navigateur de ne pas revenir à la page sur le serveur il simplement de recharger les locaux version en cache de la page. Toutes les solutions ci-dessous semblent l'ignorer et ne font rien de plus que ce que vous faites ici. Bref ... il n'y a pas de réponse à cette question qui permettra de résoudre à l'utilisateur de regarder leur cache car à ce jour je ne crois pas qu'il existe un moyen de vider le cache en dire ... js ou avec un serveur côté de l'instruction.
- Cette réponse vous propose quelques façons de vérifier, surtout si vous êtes site ne PEN tests: stackoverflow.com/questions/31565632/...
Vous devez vous connecter pour publier un commentaire.
Les utilisateurs peuvent continuer à parcourir votre site web parce que les cookies ne sont pas effacés lorsque vous appelez
FormsAuthentication.SignOut()
et ils sont authentifiés sur chaque nouvelle demande. Dans MS documentation est dit que le cookie sera effacé, mais ils ne sont pas, bug?Ses exactement la même chose avec
Session.Abandon()
, cookie est toujours là.Vous devez modifier votre code pour cela:
HttpCookie
est dans leSystem.Web
espace de noms. Référence MSDN.LoginStatus
de contrôle pour déconnecter l'utilisateur de désactiver ces cookies?<asp:LoginStatus ID="LoginStatus1" runat="server" />
? Si non, comment puis-je ajouter le code ci-dessus pour exécuter trop quand je clique sur le bouton "quitter" ci-dessus?Context.User = null
FormsAuthentication.SignOut()
est-ce à moins que votre authentification n'est pas configuré correctement. Mais encore, si vous souhaitez réinitialiser la date d'expiration d'un cookie, à la peur de bien faire les choses.HttpContext.Current.Request.Cookies.AllKeys.ToList().ForEach(s => HttpContext.Current.Request.Cookies[s].Expires = DateTime.Now.AddDays(-1))
va itérer sur tous les témoins et leur date d'expiration de la réinitialisation, donc rien n'est laissé derrière quand vous vous déconnectez.Me semble que vous n'avez pas votre site web.config autorisation section configurer correctement à l'intérieur . Voir ci-dessous pour un exemple.
À l'aide de deux au-dessus de l'affichage des postes par x64igor et Phil Haselden résolu ce problème:
1. x64igor a donné l'exemple à faire de la Déconnexion:
Vous devez d'abord Effacer le Cookie d'Authentification et de Session Cookie en passant à vide les cookies dans la Réponse à la Déconnexion.
2. Phil Haselden a donné l'exemple ci-dessus de façon à empêcher la mise en cache après déconnexion:
Vous devez Invalider le Cache sur le Côté Client via la Réponse.
SessionStateSection sessionStateSection = (SessionStateSection)WebConfigurationManager.GetSection("system.web/sessionState"); HttpCookie sessionCookie = new HttpCookie(sessionStateSection.CookieName, "");
. En général, le cookie de session nom n'est pas"ASP.NET_SessionId"
.La clé ici est que vous dites "Si je tape une URL directement...".
Par défaut sous formes d'authentification le navigateur met en cache les pages pour l'utilisateur. Donc, choisir une URL directement depuis les navigateurs adresse de la zone de liste déroulante, ou de le taper dans la, PEUT obtenir de la page dans le cache du navigateur, et de ne jamais revenir au serveur pour vérifier l'authentification/autorisation. La solution à ce problème est d'empêcher la mise en cache côté client dans l'événement Page_Load de chaque page, ou dans le OnLoad() de votre page de base:
Vous pouvez aussi appeler:
J'ai lutté avec cette avant de trop.
Voici une analogie de ce qui semble être en cours... Un nouveau visiteur, Joe, qui vient sur le site et connecte via la page de connexion à l'aide de FormsAuthentication. ASP.NET génère une nouvelle identité pour Joe, et lui donne un cookie. Ce cookie est comme la clé de la maison, et aussi longtemps que Joe revient avec cette clé, il peut ouvrir la serrure. Chaque visiteur est donné une nouvelle clé et une nouvelle serrure à utiliser.
Quand
FormsAuthentication.SignOut()
est appelé, le système dit à Joe de perdre la clé. Normalement, cela fonctionne, puisque Joe n'a plus la clé, il ne peut pas y entrer.Toutefois, si Joe vient jamais en arrière, et ne qui ont perdu la clé, il est laissé en arrière!
De ce que je peux dire, il n'y a aucun moyen de savoir ASP.NET pour changer la serrure de la porte!
La façon dont je peux vivre avec ce souvenir de Joe nom dans une variable de Session. Lorsqu'il se déconnecte, j'abandonne la Session donc je n'ai pas son nom plus. Plus tard, pour vérifier si il est autorisé, j'ai tout simplement vérifier son Identité.Nom à ce que la session en cours, et si elles ne correspondent pas, il n'est pas valide visiteur.
En bref, pour un site web, ne comptez PAS sur
User.Identity.IsAuthenticated
sans vérification de vos variables de Session!Cela fonctionne pour moi
Après beaucoup de recherche, enfin, cela a fonctionné pour moi . J'espère que cela aide.
Le code que vous avez posté ressemble à supprimer correctement les formulaires de jeton d'authentification, il est possible que les dossiers/les pages en question ne sont pas effectivement protégés.
Avez-vous confirmé que les pages ne peut pas être consulté avant qu'une connexion a eu lieu?
Vous pouvez publier sur le web.paramètres de configuration et le code de connexion que vous utilisez?
J'ai écrit une classe de base pour toutes mes Pages et j'en suis venu à la même question.
J'ai eu un code comme suit et Il ne fonctionne pas. Par suivi, le contrôle passe de RedirectToLoginPage() instruction à la ligne suivante sans être redirigé.
J'ai trouvé qu'il y a deux solutions.
Soit à modifier FormsAuthentication.RedirectToLoginPage(); pour être
OU de modifier le site web.config en ajoutant
Dans le second cas, pendant le suivi, le contrôle n'a pas atteint la page demandée. Il a été immédiatement redirigé vers l'url de connexion avant d'atteindre le point de rupture.
Par conséquent, La SignOut() la méthode n'est pas la question, la méthode de redirection est l'un.
J'espère que peut aider quelqu'un
Ce qui concerne
J'ai juste essayé quelques suggestions ici et pendant que j'étais en mesure d'utiliser le bouton précédent du navigateur, lorsque je clique sur un menu de sélection de la [Autoriser] jeton pour que [ActionResult] m'a envoyé le droit de retour à l'écran de connexion.
Voici ma déconnexion code:
Bien que le retour de la fonction sur le navigateur m'a pris à nouveau et affiche la garantie de menu (je travaille toujours sur le qui) je n'étais pas capable de faire tout ce qui a été obtenu dans l'application.
Espère que cette aide
<deny users="?" />
dans le web.config)J'ai essayé la plupart des réponses dans ce fil, pas de chance. Fini avec cela:
Trouvé ici: http://forums.asp.net/t/1306526.aspx/1
Cette Réponse est techniquement identique à Khosro.Pakmanesh. Je poste pour clarifier la façon dont sa réponse diffère des autres réponses sur ce fil, et dans lequel cas d'utilisation, il peut être utilisé.
En général pour effacer un utilisateur de session, de faire
efficacement pour déconnecter l'utilisateur. Cependant, si dans la même Demande, vous devez vérifier
Request.isAuthenticated
(comme cela peut arriver souvent dans une Autorisation de Filtre, par exemple), alors vous trouverez quemême _after vous n'avez
HttpContext.Session.Abandon()
etFormsAuthentication.SignOut()
.La seule chose qui a fonctionné a été fait
Qui détermine
Request.isAuthenticated = false
.Cela a commencé pour moi quand j'ai mis le authentification > formes > Chemin d'accès de la propriété dans
Web.config
. Retrait qui a résolu le problème, et un simpleFormsAuthentication.SignOut();
de nouveau supprimé le cookie.Il se pourrait que vous êtes connecté à partir d'un sous-domaine (sub1.domain.com) et ensuite essayer de vous déconnecter à partir d'un autre sous-domaine (www.domain.com).
J'ai juste eu le même problème, où SignOut() apparemment échoué à supprimer correctement le billet. Mais seulement dans un cas particulier, où une autre logique causé une redirection. Après j'ai enlevé cette deuxième redirect (remplacé par un message d'erreur), le problème a disparu.
Le problème doit avoir été que la page redirigée au mauvais moment, donc pas de déclenchement d'authentification.
Je vais avoir un problème similaire et je crois que le problème dans mon cas, ainsi que l'affiche originale est à cause de la redirection. Par défaut, une Réponse.Rediriger provoque une exception qui a immédiatement bulles jusqu'à ce qu'il est pris et la redirection est immédiatement exécuté, je suppose que c'est la prévention de la modification de la collection cookie d'être transmis au client. Si vous modifiez votre code à utiliser:
Cela empêche l'exception et semble permettre que le cookie est envoyé au client.
Juste essayer d'envoyer une variable de session lorsque vous appuyez sur se connecter.
Et sur la page d'accueil, vérifiez d'abord si la session est vide comme ça dans le chargement de la page ou dans l'Événement Init:
Pour moi, l'approche suivante œuvres. Je pense que si il y a une erreur après le "FormsAuthentication.SignOut()" déclaration, SingOut ne fonctionne pas.
Êtes-vous tester/voir ce comportement à l'aide de IE? Il est possible que IE est au service de ces pages à partir du cache. Il est notoirement difficile à obtenir IE pour vider son cache, et donc à de nombreuses reprises, même après que vous vous déconnectez, en tapant l'url de l'un des "sécurisé" pages afficher le contenu mis en cache avant.
(J'ai vu ce comportement, même lorsque vous ouvrez une session en tant qu'utilisateur différent, et IE montre la "Bienvenue" de la barre en haut de votre page, avec l'ancien nom de l'utilisateur. De nos jours, généralement à une recharge de mise à jour, mais si c'est persistant, il peut encore être un problème de mise en cache.)
Faire Session.abandonner() et de détruire le cookie fonctionne assez bien. Je suis l'aide de mvc3 et il semble que le problème se produit si vous allez à une page protégée, déconnectez-vous et accédez via l'historique de votre navigateur. Pas une grosse affaire, mais encore un peu ennuyeux.
En essayant de passer par les liens sur mon web app fonctionne le droit chemin même si.
Paramètre pour ne pas faire de mise en cache du navigateur peut être le chemin à parcourir.
Pour MVC cela fonctionne pour moi:
Je voulais ajouter quelques informations pour vous aider à comprendre le problème. L'Authentification de formulaires permet de stocker les données de l'utilisateur dans un cookie, ou dans la chaîne de requête de l'URL. La méthode de votre site prend en charge peuvent être configurés dans le web.fichier de configuration.
Selon Microsoft:
Dans le même temps, ils disent:
Enfin, concernant UseDeviceProfile, ils disent:
Rassembler tous ensemble, en fonction du navigateur de l'utilisateur, la configuration par défaut peut entraîner CookiesSupported être vrai, ce qui signifie que le SignOut méthode n'est pas évident de la billetterie à partir du cookie. Cela semble contre-intuitif, et je ne sais pas pourquoi cela fonctionne de cette façon-je en droit d'attendre SignOut à signer réellement l'utilisateur dans toutes les circonstances.
Une manière de faire de la SignOut travail par lui-même est de changer le mode de cookie pour "Utilisercookies" (c'est à dire, les cookies sont nécessaires) dans le site web.fichier de configuration:
Selon mes tests, cela fait SignOut travail par lui-même au coût de votre site exige maintenant des cookies pour fonctionner correctement.
Être conscient que WIF refuse de dire au navigateur de nettoyer les cookies si le wsignoutcleanup message de STS ne correspond pas à l'url avec le nom de l'application à partir de IIS, et je veux dire SENSIBLE à la casse. WIF répond avec le vert OK vérifier, mais pas envoyer la commande pour supprimer les cookies du navigateur.
Donc, vous avez besoin de prêter attention à la casse de votre url.
Par exemple, ThinkTecture Identité du Serveur enregistre l'url de la visite de RPs dans un cookie, mais il les rend tous en minuscules. WIF recevrez le wsignoutcleanup message en minuscules et de le comparer avec le nom de l'application dans IIS. Si elle ne correspond pas, il les supprime pas les cookies, mais fera rapport sur OK pour le navigateur. Donc, pour cette Identité Serveur, j'ai besoin de l'écrire toutes les url dans le web.config et tous les noms d'application dans IIS en minuscules, afin d'éviter de tels problèmes.
Aussi n'oubliez pas de permettre à des tiers les cookies dans le navigateur si vous avez les applications en dehors du sous-domaine de la STS, sinon le navigateur ne va pas supprimer les cookies, même si WIF lui dit alors.