authentification http basic " Se Déconnecter"

les justificatifs D'authentification HTTP de base sont stockés jusqu'à la fermeture du navigateur, mais y a-t-il un moyen de les supprimer avant la fermeture du navigateur?

j'ai lu à propos d'un truc avec le code de statut HTTP 401 , mais il semble que ne fonctionne pas correctement (voir commentaire pour répondre). Peut-être que le mécanisme utilisé par trac est la solution .

peut-on supprimer les lettres de créance avec JavaScript? Ou avec une combinaison de JavaScript et le truc du statut 401?

58
demandé sur Community 2010-11-12 12:20:13

7 réponses

Update : Cette solution ne semble plus fonctionner dans de nombreux navigateurs. Commentaire de Kaitsu:

cette solution d'envoi de faux justificatifs d'identité pour faire oublier au navigateur les justificatifs d'identité authentifiés ne fonctionne pas dans Chrome (16) et IE (9). Fonctionne dans Firefox (9).


en fait, vous pouvez mettre en œuvre une solution de contournement en envoyant de faux justificatifs d'identité au service. Ce fonctionne dans les navigateurs en envoyant un autre (inexistant?) Nom d'utilisateur sans mot de passe. Le navigateur perd l'information sur les justificatifs d'identité authentifiés.

exemple:

https://www.example.com/ => ouverture de session avec l'autorisation de base comme "user1 "

Maintenant, ouvrez

https://foobar@www.example.com /

vous êtes Déconnecter. ;)

concerne

P. S.: Mais s'il vous plaît tester avec tous les navigateurs nécessaires avant de vous reposer sur les informations données.

33
répondu Jan. 2013-03-28 09:54:49

l'Expansion de sur Janv.'S réponse, et mise à jour de la réponse d'owyongsk:

voici un exemple de code jQuery java-script pour amener le navigateur à envoyer essentiellement une demande de connexion bidon à la page que vous essayez de protéger, ce qui dans tous les navigateurs testés a causé les justificatifs d'identité mis en cache pour être supprimé, puis redirige l'utilisateur vers une page non protégée.

Le alert() quand quelque chose va mal devrait probablement être changé en quelque chose d'autre.

//Submits an invalid authentication header, causing the user to be 'logged out'
function logout() {
    $.ajax({
        type: "GET",
        url: "PUT_YOUR_PROTECTED_URL_HERE",
        dataType: 'json',
        async: true,
        username: "some_username_that_doesn't_exist",
        password: "any_stupid_password",
        data: '{ "comment" }'
    })
//In our case, we WANT to get access denied, so a success would be a failure.
.done(function(){
    alert('Error!')
})
//Likewise, a failure *usually* means we succeeded.
//set window.location to redirect the user to wherever you want them to go
.fail(function(){
    window.location = "/";
    });
}

alors c'était aussi simple que d'avoir simplement le lien de déconnexion appelé la fonction de déconnexion (), et cela semblait fonctionner de façon transparente pour l'utilisateur, bien que ce soit encore techniquement un travail de piratage.

10
répondu 1n5aN1aC 2016-02-23 04:13:54

vous pouvez essayer un hack qui fonctionne en ce moment avec les derniers Chrome et Firefox. Créez une page" / logout " sur votre serveur qui n'accepte qu'un certain justificatif tel que nom d'utilisateur: false, mot de passe: false. Ensuite, en utilisant cette requête AJAX ci-dessous, vous pouvez envoyer l'utilisateur à cette page.

  $("#logout").click(function(e){                                              
    e.preventDefault();                                                        
    var request = new XMLHttpRequest();                                        
    request.open("get", "/logout", false, "false", "false");                                                                                                                               
    request.send();                                                            
    window.location.replace("WHEREVER YOU WANT YOUR LOGGED OUT USER TO GO");                                              
  });

ce qui se passe, c'est que le faux nom d'utilisateur et mot de passe est mis en cache à partir de XMLHttpRequest valide au lieu des justificatifs d'identité de l'utilisateur courant, et quand un utilisateur essaie de connectez-vous à n'importe quelle page, il va utiliser les faux justificatifs d'identité mis en cache, faute de s'authentifier, il va demander à l'utilisateur d'entrer un autre. Espérons que cette aide!

7
répondu owyongsk 2013-06-07 16:51:27

je finissais une implémentation qui marchait très bien pour moi: Sur le serveur, j'évalue la Session, le nom D'Utilisateur et le mot de passe, donc je garde trace de cette information, l'algorithme de connexion est comme suit:

1.Vérifiez si l'utilisateur et le mot de passe ne sont pas vides, sinon revenez 401.

2.Vérifiez si nous avons enregistré la session dans notre liste d'utilisateurs, sinon vérifiez si l'utilisateur et le mot de passe sont valides et, si c'est le cas, sauvegardez l'id de session dans notre liste, puis retournez 401. Je vais expliquez cette étape: si l'id de session est différent une des trois choses est arrivée: a) l'utilisateur ouvre une autre fenêtre. b) la session utilisateur est terminée, c'est-à-dire que l'utilisateur s'est déconnecté. c) La session a expiré en raison de l'inactivité. Mais nous voulons sauver la session aussi longtemps que les informations d'identification de l'utilisateur sont valides, mais retourner une 401 pour demander une fois le mot de passe, si nous ne sauvons pas la session alors l'utilisateur ne pourrait jamais se connecter parce que nous n'avons pas le nouvel id de session dans notre liste.

3.Vérifiez si les informations d'identification de l'utilisateur sont correctes, si c'est le cas, enregistrez les informations de session et continuez à servir des pages, sinon retournez 401.

ainsi, la seule chose que je dois déconnecter un utilisateur est de fermer la session sur le serveur lorsque l'utilisateur demande la page de déconnexion et le navigateur Web montre à nouveau la boîte de dialogue de connexion.

je pense en écrivant ceci qu'il doit y avoir une étape où le programme vérifie si l'utilisateur est déjà connecté pour éviter l'usurpation d'identité, peut-être que je peux sauver plus que un id de session par utilisateur pour permettre plusieurs sessions, Eh bien, je voudrais vos commentaires à ce sujet.

Espère que vous avez l'idée, et de commenter si vous voyez une faille de sécurité ;)

4
répondu Erwin 2011-07-30 05:21:15

vous pouvez supprimer les justificatifs D'identité avec JavaScript:

    $("#logout").click(function(){
        try {
            document.execCommand("ClearAuthenticationCache");
            window.location.href('/logout.html'); // page with logout message somewhere in not protected directory
        } catch (exception) {}
    });

ce code ne fonctionne qu'en IE. C'est la raison pour laquelle bloc try/catch y est ajoutée. Aussi, pour la même raison, le lien de déconnexion que vous devriez montrer pour les utilisateurs de IE seulement:

    <!--[if IE]>
        <div id="logout">[Logout]</div>
    <![endif]-->

et pour les autres utilisateurs ma suggestion est quelque chose comme:

    <div id="logout2" onclick="alert('Please close your browser window to logout')">[Logout]</div>
4
répondu Vilius Gaidelis 2012-06-10 20:23:52

si vous avez le contrôle sur le code du serveur, vous pouvez créer une fonction" logout "qui répond" 401 Unauthorized " indépendamment des informations d'identification fournies. Cette défaillance oblige les navigateurs à supprimer les justificatifs d'identité enregistrés.

je viens de le tester avec Chrome 34, i.e. 11, Firefox 25 - en utilisant Express.authentification de base du serveur JS et HTTP.

3
répondu Greg T 2014-05-30 16:42:44

ce qui a fonctionné pour moi dans Chrome (Version 66) est d'envoyer une requête Ajax à une URL qui renvoie 401. De cette façon, le cache d'authentification basique semble être effacé.

var xhttp = new XMLHttpRequest();
xhttp.open("GET", "/url_that_returns_401", true);
xhttp.send();
0
répondu Thomas 2018-04-26 07:35:39