Est-il possible de déconnecter un utilisateur d'un site Web s'il utilise l'authentification de base?
Tuer une session ne suffit pas, car une fois que l'utilisateur est authentifié, chaque demande contient des informations de connexion, de sorte que l'utilisateur est automatiquement connecté la prochaine fois qu'il accède au site en utilisant les mêmes informations d'identification.
La seule solution jusqu'à présent est de fermer le navigateur, mais ce n'est pas acceptable du point de vue de l'utilisabilité.
/
page, ils se reconnecteront automatiquement.Réponses:
L'authentification de base n'a pas été conçue pour gérer la déconnexion. Vous pouvez le faire, mais pas complètement automatiquement.
Ce que vous devez faire, c'est que l'utilisateur clique sur un lien de déconnexion et envoie un `` 401 non autorisé '' en réponse, en utilisant le même domaine et au même niveau de dossier URL que le 401 normal que vous envoyez en demandant une connexion.
Ils doivent être dirigés pour saisir ensuite des informations d'identification erronées, par exemple. un nom d'utilisateur et un mot de passe vierges, et en réponse, vous renvoyez une page «Vous avez réussi à vous déconnecter». Les informations d'identification incorrectes / vierges remplaceront alors les informations d'identification correctes précédentes.
En bref, le script de déconnexion inverse la logique du script de connexion, ne renvoyant la page de réussite que si l'utilisateur ne transmet pas les bonnes informations d'identification.
La question est de savoir si la boîte de mot de passe quelque peu curieuse «ne saisissez pas votre mot de passe» rencontrera l'acceptation des utilisateurs. Les gestionnaires de mots de passe qui essaient de remplir automatiquement le mot de passe peuvent également vous gêner ici.
Modifier pour ajouter en réponse au commentaire: la reconnexion est un problème légèrement différent (sauf si vous avez besoin d'une déconnexion / connexion en deux étapes évidemment). Vous devez rejeter (401) la première tentative d'accès au lien de reconnexion, puis accepter la seconde (qui a vraisemblablement un nom d'utilisateur / mot de passe différent). Il existe plusieurs façons de procéder. La première consisterait à inclure le nom d'utilisateur actuel dans le lien de déconnexion (par exemple. / Relogin? Nom d'utilisateur) et à le rejeter lorsque les informations d'identification correspondent au nom d'utilisateur.
la source
Un complément à la réponse de bobince ...
Avec Ajax, vous pouvez avoir votre lien / bouton de déconnexion câblé à une fonction Javascript. Demandez à cette fonction d'envoyer le XMLHttpRequest avec un mauvais nom d'utilisateur et mot de passe. Cela devrait récupérer un 401. Ensuite, définissez document.location sur la page de pré-connexion. De cette façon, l'utilisateur ne verra jamais la boîte de dialogue de connexion supplémentaire lors de la déconnexion, ni n'aura à se rappeler de saisir de mauvaises informations d'identification.
la source
Demandez à l'utilisateur de cliquer sur un lien vers https: // log: [email protected]/ . Cela remplacera les informations d'identification existantes par des informations non valides; les déconnecter.
la source
Vous pouvez le faire entièrement en JavaScript:
IE a (depuis longtemps) une API standard pour effacer le cache d'authentification de base:
Devrait retourner vrai quand cela fonctionne. Renvoie soit faux, non défini ou explose sur d'autres navigateurs.
Les nouveaux navigateurs (depuis décembre 2012: Chrome, FireFox, Safari) ont un comportement "magique". S'ils voient une demande d'authentification de base réussie avec un autre faux nom d'utilisateur (disons
logout
), ils effacent le cache des informations d'identification et le définissent éventuellement pour ce nouveau nom d'utilisateur faux, dont vous devez vous assurer qu'il ne s'agit pas d'un nom d'utilisateur valide pour afficher le contenu.Un exemple de base de ceci est:
Une façon "asynchrone" de faire ce qui précède est de faire un appel AJAX en utilisant le
logout
nom d'utilisateur. Exemple:Vous pouvez également en faire un bookmarklet:
javascript:(function(c){var a,b="You should be logged out now.";try{a=document.execCommand("ClearAuthenticationCache")}catch(d){}a||((a=window.XMLHttpRequest?new window.XMLHttpRequest:window.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):void 0)?(a.open("HEAD",c||location.href,!0,"logout",(new Date).getTime().toString()),a.send(""),a=1):a=void 0);a||(b="Your browser is too old or too weird to support log out functionality. Close all windows and restart the browser.");alert(b)})(/*pass safeLocation here if you need*/);
la source
logout
nom d'utilisateur et / ou de l'URL de déconnexion?logout
existe et se trouve avoir le mot de passe généré. Dans ce cas presque incroyablement rare, remplacez l'ID utilisateur par un autre qui n'existera pas sur votre système.<a href='javascript:......need*/);'>Logout</a>
La fonction suivante est confirmée pour Firefox 40, Chrome 44, Opera 31 et IE 11.
Bowser est utilisé pour la détection du navigateur, jQuery est également utilisé.
- secUrl est l'URL d'une zone protégée par mot de passe à partir de laquelle vous déconnecter.
- redirUrl est l'URL d'une zone non protégée par mot de passe (page de réussite de déconnexion).
- vous souhaiterez peut-être augmenter le délai de redirection (actuellement 200 ms).
la source
$.ajax
variante étant synchrone (async: false
) et laxmlhttp
variante étant asynchrone (l'true
enopen()
)?(bowser.gecko)
à(bowser.gecko || bowser.blink)
.$.ajax
et webkitnew XMLHttpRequest
? Est-ce que gecko / blink ne devrait pas être capable de faireXMLHttpRequest
et webkit devrait être capable de faire$.ajax
aussi? Je suis confus.Voici un exemple Javascript très simple utilisant jQuery:
Cet utilisateur se déconnecte sans lui montrer à nouveau la boîte de connexion du navigateur, puis le redirige vers une page déconnectée
la source
Ce n'est pas directement possible avec l'authentification de base.
Il n'y a aucun mécanisme dans la spécification HTTP pour que le serveur dise au navigateur d'arrêter d'envoyer les informations d'identification que l'utilisateur a déjà présentées.
Il existe des «hacks» (voir les autres réponses) impliquant généralement l'utilisation de XMLHttpRequest pour envoyer une demande HTTP avec des informations d'identification incorrectes pour remplacer celles fournies à l'origine.
la source
Cela fonctionne pour IE / Netscape / Chrome:
la source
C'est en fait assez simple.
Il vous suffit de visiter ce qui suit dans votre navigateur et d'utiliser des informations d'identification incorrectes: http: // nom d'utilisateur: mot de [email protected]
Cela devrait vous déconnecter.
la source
Tout ce dont vous avez besoin est de rediriger l'utilisateur sur une URL de déconnexion et de renvoyer une
401 Unauthorized
erreur dessus. Sur la page d'erreur (qui doit être accessible sans authentification de base), vous devez fournir un lien complet vers votre page d'accueil (y compris le schéma et le nom d'hôte). L'utilisateur cliquera sur ce lien et le navigateur demandera à nouveau les informations d'identification.Exemple pour Nginx:
Page d'erreur
/home/user/errors/401.html
:la source
http_host
au401.html
lieu de simplementhost
, car le premier ajoute également le numéro de port (dans le cas où un port non standard est utilisé)la source
la source
Sur la base de ce que j'ai lu ci-dessus, j'ai obtenu une solution simple qui fonctionne sur n'importe quel navigateur:
1) sur votre page de déconnexion, vous appelez un ajax à votre backend de connexion. Votre backend de connexion doit accepter l'utilisateur de déconnexion. Une fois que le back-end accepte, le navigateur efface l'utilisateur actuel et suppose l'utilisateur "déconnexion".
2) Maintenant, lorsque l'utilisateur est revenu au fichier d'index normal, il essaiera d'entrer automatiquement dans le système avec la "déconnexion" de l'utilisateur, cette deuxième fois, vous devez le bloquer en répondant avec 401 pour appeler la boîte de dialogue de connexion / mot de passe.
3) Il existe plusieurs façons de le faire, j'ai créé deux backends de connexion, un qui accepte l'utilisateur de déconnexion et un qui ne le fait pas. Ma page de connexion normale utilise celle qui n'accepte pas, ma page de déconnexion utilise celle qui l'accepte.
la source
Je viens de tester les éléments suivants dans Chrome (79), Firefox (71) et Edge (44) et cela fonctionne très bien. Il applique la solution de script comme d'autres l'ont noté ci-dessus.
Ajoutez simplement un lien "Déconnexion" et lorsque vous cliquez dessus, renvoyez le code HTML suivant
la source
Ce JavaScript doit fonctionner pour tous les navigateurs de la dernière version:
la source
ajoutez ceci à votre application:
la source
tapez
chrome://restart
dans la barre d'adresse et Chrome, avec toutes ses applications qui s'exécutent en arrière-plan, redémarrera et le cache de mot de passe Auth sera nettoyé.la source
Pour mémoire, il y a un nouvel en-tête de réponse HTTP appelé
Clear-Site-Data
. Si la réponse de votre serveur comprend un en-Clear-Site-Data: "cookies"
tête, les informations d'authentification (pas seulement les cookies) doivent être supprimées. Je l'ai testé sur Chrome 77 mais cet avertissement s'affiche sur la console:Et les informations d'authentification ne sont pas supprimées, donc cela ne fonctionne pas (pour l'instant) pour implémenter les déconnexions d'authentification de base, mais peut-être à l'avenir. N'a pas testé sur d'autres navigateurs.
Références:
https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Clear-Site-Data
https://www.w3.org/TR/clear-site-data/
https://github.com/w3c/webappsec-clear-site-data
https://caniuse.com/#feat=mdn-http_headers_clear-site-data_cookies
la source
L'envoi
https://invalid_login@hostname
fonctionne très bien partout sauf Safari sur Mac (enfin, pas vérifié Edge mais devrait fonctionner là aussi).La déconnexion ne fonctionne pas dans Safari lorsqu'un utilisateur sélectionne «mémoriser le mot de passe» dans la fenêtre contextuelle d'authentification de base HTTP. Dans ce cas, le mot de passe est stocké dans Keychain Access (Finder> Applications> Utilities> Keychain Access (ou CMD + SPACE et tapez "Keychain Access")). L'envoi
https://invalid_login@hostname
n'affecte pas l'accès au trousseau, donc avec cette case à cocher, il n'est pas possible de se déconnecter sur Safari sur Mac. Au moins, c'est comme ça que ça marche pour moi.MacOS Mojave (10.14.6), Safari 12.1.2.
Le code ci-dessous fonctionne bien pour moi dans Firefox (73), Chrome (80) et Safari (12). Lorsqu'un utilisateur accède à une page de déconnexion, le code est exécuté et supprime les informations d'identification.
De plus, pour une raison quelconque, Safari n'enregistre pas les informations d'identification dans la fenêtre contextuelle d'authentification de base HTTP, même lorsque le «souvenir du mot de passe» est sélectionné. Les autres navigateurs le font correctement.
la source
la source
J'ai mis à jour la solution de mthoring pour les versions modernes de Chrome:
la source