312 votes

Comment faire pour déconnecter l’utilisateur du site web à l’aide de l’authentification de base ?

Est-il possible de déconnecter l’utilisateur d’un site web si il utilise l’authentification de base ?

Session de meurtre n’est pas suffisant, puisque, une fois l’utilisateur authentifié, chaque demande contient les informations de connexion, afin que l’utilisateur est enregistré automatiquement dans la prochaine fois, il a accès au site en utilisant les mêmes informations d’identification.

Jusqu'à présent, la seule solution est de fermer le navigateur, mais ce n’est pas acceptable du point de vue facilité d’utilisation.

215voto

Matthew Welborn Points 229

Demandez à l’utilisateur de cliquer sur un lien vers http://log:out@yoursite.com/. Cela écrasera les informations d’identification existantes avec celles non valides leur déconnexion.

201voto

system PAUSE Points 10051

Un complément à la réponse de bobince...

Avec Ajax, vous pouvez avoir votre lien/bouton « Logout » câblé à une fonction Javascript. A cette fonction Envoyer le XMLHttpRequest avec un mauvais nom d’utilisateur et le mot de passe. Cela devrait revenir un 401. Puis la valeur document.location retour à la page avant ouverture de session. De cette façon, l’utilisateur sera jamais voir la boîte de dialogue de connexion supplémentaire au cours de la déconnexion, ni ne faut pas oublier de mettre dans les informations d’identification de mauvaises.

180voto

bobince Points 270740

L'Authentification de base n'a pas été conçu pour gérer la déconnexion. Vous pouvez le faire, mais pas complètement automatiquement.

Ce que vous avez à faire est de demander à l'utilisateur de cliquer sur un lien de déconnexion, et d'envoyer un "401 Unauthorized" en réponse, en utilisant le même domaine et la même URL niveau de dossier que la normale 401 vous envoyer demande un login.

Ils doivent être adressées à l'entrée de mauvaises informations d'identification à côté, par exemple. un vide nom d'utilisateur et mot de passe, et en réponse vous envoyer un "Vous êtes connecté avec succès" de la page. Le mal/blank informations d'identification, puis écraser les précédentes informations d'identification correctes.

En bref, le script de déconnexion inverse la logique du script de connexion, ne revenant à la réussite de la page si l'utilisateur n'est pas en passant les informations d'identification appropriées.

La question est de savoir si le peu curieux "ne pas entrer votre mot de passe" mot de passe boîte de rencontrer d'acceptation par l'utilisateur. Gestionnaires de mots de passe qui essaient de remplir automatiquement le mot de passe peut également obtenir de la manière ici.

Modifier pour ajouter en réponse à un commentaire: re-connecter est un problème un peu différent (sauf si vous avez besoin d'une étape de deux logout/login évidemment). Vous avez à rejeter (401) de la première tentative d'accès à la reconnecter lien, que d'accepter la deuxième (qui a sans doute un autre nom d'utilisateur/mot de passe). Il existe quelques façons dont vous pouvez faire cela. On serait d'inclure le nom d'utilisateur dans le lien de déconnexion (par exemple. /reconnectez-vous?nom d'utilisateur), et de rejeter lorsque les informations d'identification correspondre au nom d'utilisateur.

74voto

ddotsenko Points 2036

Vous pouvez le faire entièrement en JavaScript:

IE a (longtemps) API standard pour la compensation de l'Authentification de Base de cache:

document.execCommand("ClearAuthenticationCache")

Doit retourner true quand il fonctionne. Retourne false, indéfinis ou des coups sur les autres navigateurs.

Les nouveaux navigateurs (à compter de Décembre 2012: Chrome, FireFox, Safari) ont "magie" de comportement. Si ils voient un succès basic auth demande avec tout bidon autre nom d'utilisateur (disons logout) qu'ils effacer le cache des informations d'identification et, éventuellement, de la définir pour que les nouveaux faux nom d'utilisateur, vous devez vous assurer que c'est pas un nom d'utilisateur valide pour l'affichage du contenu.

Exemple de base de ce qui est:

var p = window.location.protocol + '//'
// current location must return 200 OK for this GET
window.location = window.location.href.replace(p, p + 'logout:password@')

Un "asynchrone" façon de faire le ci-dessus est de faire un appel AJAX en utilisant l' logout nom d'utilisateur. Exemple:

(function(safeLocation){
    var outcome, u, m = "You should be logged out now.";
    // IE has a simple solution for it - API:
    try { outcome = document.execCommand("ClearAuthenticationCache") }catch(e){}
    // Other browsers need a larger solution - AJAX call with special user name - 'logout'.
    if (!outcome) {
        // Let's create an xmlhttp object
        outcome = (function(x){
            if (x) {
                // the reason we use "random" value for password is 
                // that browsers cache requests. changing
                // password effectively behaves like cache-busing.
                x.open("HEAD", safeLocation || location.href, true, "logout", (new Date()).getTime().toString())
                x.send("")
                // x.abort()
                return 1 // this is **speculative** "We are done." 
            } else {
                return
            }
        })(window.XMLHttpRequest ? new window.XMLHttpRequest() : ( window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : u ))
    }
    if (!outcome) {
        m = "Your browser is too old or too weird to support log out functionality. Close all windows and restart the browser."
    }
    alert(m)
    // return !!outcome
})(/*if present URI does not return 200 OK for GET, set some other 200 OK location here*/)

Vous pouvez faire un bookmarklet trop:

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*/);

10voto

Alnitak Points 143355

Ce n’est pas directement possible avec authentification Basic.

Il n’y a aucun mécanisme dans la spécification HTTP pour le serveur de dire au navigateur d’arrêter d’envoyer les informations d’identification que l’utilisateur a déjà présenté.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X