web-dev-qa-db-fra.com

authentification de base http "Déconnexion"

Les informations d'identification d'authentification de base HTTP sont stockées jusqu'à la fermeture du navigateur, mais existe-t-il un moyen de les supprimer avant la fermeture du navigateur?

J'ai lu sur un astuce avec code d'état HTTP 401 , mais il semble que ne fonctionne pas correctement (voir le commentaire pour répondre). Peut-être que le le mécanisme utilisé par Trac est la solution }.

Les informations d'identification peuvent-elles être supprimées avec JavaScript? Ou avec une combinaison de JavaScript et de l'astuce statut 401?

59
deamon

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

Cette solution d'envoi de fausses informations d'identification pour que le navigateur oublie que les informations d'identification authentifiées correctes ne fonctionne pas dans Chrome (16) et IE (9). Fonctionne dans Firefox (9).


En réalité, vous pouvez implémenter une solution de contournement en envoyant de fausses informations d'identification au service. Cela fonctionne dans les navigateurs en envoyant un autre nom d'utilisateur (inexistant?) Sans mot de passe. Le navigateur perd les informations sur les informations d'identification authentifiées.

Exemple:

https://www.example.com/ => Connectez-vous avec l'authentification de base en tant que "utilisateur1" 

Ouvert 

https: //[email protected]/

Vous êtes déconnecté. ;)

Cordialement

P.s .: Mais veuillez tester ceci avec tous les navigateurs nécessaires avant de vous fier aux informations fournies.

33
Jan.

Développer la réponse de Jan. et mettre à jour la réponse de owyongsk:

Voici un exemple de code de script Java jQuery pour que le navigateur envoie essentiellement une demande de connexion fictive à la page que vous tentez de protéger, ce qui, dans tous les navigateurs testés, entraînait la suppression des informations d'identification mises en cache, puis redirige l'utilisateur vers un site non protégé. page.

Le alert () quand quelque chose ne va pas devrait probablement être changé pour 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 = "/";
    });
}

Ensuite, c'était aussi simple que de demander au lien de déconnexion d'appeler la fonction logout (), et cela semblait fonctionner de manière transparente pour l'utilisateur, même s'il s'agissait techniquement d'un travail de piratage.

10
1n5aN1aC

Vous pouvez essayer un hack qui fonctionne pour le moment avec les derniers Chrome et Firefox. Créez une page "/ logout" sur votre serveur qui n'accepte que certaines informations d'identification, telles que nom d'utilisateur: false, mot de passe: false. Ensuite, en utilisant cette demande 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 les faux nom d'utilisateur et mot de passe sont mis en cache à partir de XMLHttpRequest valide au lieu des informations d'identification de l'utilisateur actuel. Lorsqu'un utilisateur essaie de se connecter à une page, il utilisera les fausses informations d'identification pour en entrer un autre. J'espère que cela t'aides!

7
owyongsk

Vous pouvez supprimer les informations d'identification 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 que dans IE. C’est la raison pour laquelle le bloc try/catch est ajouté ici . En outre, pour la même raison, le lien de déconnexion à afficher pour les utilisateurs de IE uniquement:

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

Et pour les autres utilisateurs, ma suggestion est la suivante:

    <div id="logout2" onclick="alert('Please close your browser window to logout')">[Logout]</div>
4
Vilius Gaidelis

je viens juste de terminer une implémentation qui me convient: Sur le serveur, j’évalue Session, nom d’utilisateur et mot de passe, je garde donc cette information en mémoire, l’algorithme de connexion est le suivant:

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

2.Vérifiez si nous avons enregistré la session dans notre liste d'utilisateurs connectés. Sinon, vérifiez si l'utilisateur et le mot de passe sont valides et, le cas échéant, enregistrez l'identifiant de session dans notre liste, puis renvoyez 401 . Je vais expliquer cette étape: si l'identifiant de session est différent, l'une des trois choses suivantes s'est produite: a) L'utilisateur ouvre une autre fenêtre . b) La session utilisateur est terminée, c.-à-d. utilisateur déconnecté . c) La session a expiré pour cause d'inactivité . Mais nous voulons enregistrer la session tant que les informations d'identification de l'utilisateur sont valides, mais renvoyer un 401 pour demander une fois le mot de passe. Si nous ne sauvegardons pas la session, l'utilisateur ne pourrait jamais se connecter car nous ne disposons pas du nouvel identifiant de session. dans notre liste.

3.Vérifiez si les informations d'identification de l'utilisateur sont correctes. Dans l'affirmative, enregistrez les informations de session et continuez à servir les pages, sinon, retournez 401. 

Donc, 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 que le navigateur Web affiche à 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'emprunt d'identité, peut-être que je peux enregistrer plus d'un identifiant de session par utilisateur pour autoriser plusieurs sessions, eh bien, j'aimerais vos commentaires à ce sujet.

J'espère que vous avez l'idée et commentez si vous voyez une faille de sécurité;)

4
Erwin

Si vous avez le contrôle sur le code serveur, vous pouvez créer une fonction "logout" qui répond "401 non autorisé" quelles que soient les informations d'identification fournies. Cet échec oblige les navigateurs à supprimer les informations d'identification enregistrées.

Je viens de tester cela avec Chrome 34, IE 11, Firefox 25 - en utilisant le serveur Express.js et l'authentification de base HTTP.

3
Greg T

Ce qui a fonctionné pour moi dans Chrome (version 66) est d’envoyer une demande Ajax à une URL qui renvoie 401. Ainsi, le cache d’authentification de base semble être effacé.

var xhttp = new XMLHttpRequest();
xhttp.open("GET", "/url_that_returns_401", true);
xhttp.send();
0
Thomas