Ist es möglich, Benutzer von einer Website abzumelden, wenn er die Basisauthentifizierung verwendet?
Das Beenden einer Sitzung reicht nicht aus, da jede Anforderung nach der Authentifizierung des Benutzers Anmeldeinformationen enthält, sodass der Benutzer beim nächsten Zugriff auf die Site mit denselben Anmeldeinformationen automatisch angemeldet wird.
Die einzige Lösung besteht bisher darin, den Browser zu schließen. Dies ist jedoch unter dem Gesichtspunkt der Benutzerfreundlichkeit nicht akzeptabel.
/
Seite lädt , werden sie automatisch wieder angemeldet.Antworten:
Die Standardauthentifizierung wurde nicht zum Verwalten der Abmeldung entwickelt. Sie können es tun, aber nicht ganz automatisch.
Was Sie tun müssen, ist, dass der Benutzer auf einen Abmeldelink klickt und als Antwort eine "401 Unauthorized" sendet, wobei er denselben Bereich und dieselbe URL-Ordnerebene wie die normale 401 verwendet, die Sie senden, um eine Anmeldung anzufordern.
Sie müssen angewiesen werden, als nächstes falsche Anmeldeinformationen einzugeben, z. einen leeren Benutzernamen und ein leeres Passwort, und als Antwort senden Sie eine Seite "Sie haben sich erfolgreich abgemeldet" zurück. Die falschen / leeren Anmeldeinformationen überschreiben dann die vorherigen korrekten Anmeldeinformationen.
Kurz gesagt, das Abmeldeskript kehrt die Logik des Anmeldeskripts um und gibt die Erfolgsseite nur zurück, wenn der Benutzer nicht die richtigen Anmeldeinformationen übergibt.
Die Frage ist, ob das etwas merkwürdige Passwortfeld "Geben Sie Ihr Passwort nicht ein" die Akzeptanz beim Benutzer findet. Kennwortmanager, die versuchen, das Kennwort automatisch einzugeben, können hier ebenfalls im Weg stehen.
Bearbeiten, um als Antwort auf einen Kommentar hinzuzufügen: Die erneute Anmeldung ist ein etwas anderes Problem (es sei denn, Sie benötigen offensichtlich eine zweistufige Abmeldung / Anmeldung). Sie müssen den ersten Versuch, auf den Relogin-Link zuzugreifen, ablehnen (401), als den zweiten zu akzeptieren (der vermutlich einen anderen Benutzernamen / ein anderes Passwort hat). Es gibt einige Möglichkeiten, wie Sie dies tun können. Eine Möglichkeit besteht darin, den aktuellen Benutzernamen in den Abmeldelink aufzunehmen (z. B. / relogin? Benutzername) und abzulehnen, wenn die Anmeldeinformationen mit dem Benutzernamen übereinstimmen.
quelle
Eine Ergänzung zur Antwort von Bobince ...
Mit Ajax können Sie Ihren Link / Button "Abmelden" mit einer Javascript-Funktion verbinden. Lassen Sie diese Funktion die XMLHttpRequest mit einem falschen Benutzernamen und Passwort senden. Dies sollte einen 401 zurückgeben. Setzen Sie dann document.location zurück auf die Voranmeldeseite. Auf diese Weise wird dem Benutzer während der Abmeldung niemals der zusätzliche Anmeldedialog angezeigt, und er muss auch nicht daran denken, falsche Anmeldeinformationen einzugeben.
quelle
Lassen Sie den Benutzer auf einen Link zu https: // log: [email protected]/ klicken . Dadurch werden vorhandene Anmeldeinformationen mit ungültigen überschrieben. Abmelden.
quelle
Sie können dies vollständig in JavaScript tun:
IE verfügt (seit langem) über eine Standard-API zum Löschen des Cache für die Standardauthentifizierung:
Sollte true zurückgeben, wenn es funktioniert. Gibt entweder false, undefined oder explodiert in anderen Browsern zurück.
Neue Browser (Stand Dezember 2012: Chrome, FireFox, Safari) verhalten sich "magisch". Wenn sie eine erfolgreiche grundlegende Authentifizierungsanforderung mit einem falschen anderen Benutzernamen sehen (sagen wir
logout
), löschen sie den Cache für Anmeldeinformationen und legen ihn möglicherweise für diesen neuen falschen Benutzernamen fest, den Sie sicherstellen müssen, dass es sich nicht um einen gültigen Benutzernamen zum Anzeigen von Inhalten handelt.Grundlegendes Beispiel dafür ist:
Eine "asynchrone" Möglichkeit, dies zu tun, besteht darin, einen AJAX-Aufruf unter Verwendung des
logout
Benutzernamens durchzuführen. Beispiel:Sie können es auch zu einem Lesezeichen machen:
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*/);
quelle
logout
Benutzernamens und / oder der Abmelde-URL?logout
existiert und das generierte Passwort hat. Ändern Sie in diesem fast unmöglich seltenen Fall die Benutzer-ID in eine ID, die in Ihrem System nicht vorhanden ist.<a href='javascript:......need*/);'>Logout</a>
Die folgende Funktion wurde für Firefox 40, Chrome 44, Opera 31 und IE 11 bestätigt.
Bowser wird zur Browsererkennung verwendet, jQuery wird ebenfalls verwendet.
- secUrl ist die URL zu einem kennwortgeschützten Bereich, von dem aus Sie sich abmelden können.
- redirUrl ist die URL zu einem nicht kennwortgeschützten Bereich (Abmeldungserfolgsseite).
- Möglicherweise möchten Sie den Umleitungszeitgeber (derzeit 200 ms) erhöhen.
quelle
$.ajax
Variante synchron (async: false
) und diexmlhttp
Variante asynchron (true
inopen()
) ist?(bowser.gecko)
zu(bowser.gecko || bowser.blink)
.$.ajax
und Webkit verwendetnew XMLHttpRequest
? Sollte Gecko / Blink nicht dazu in der Lage seinXMLHttpRequest
und Webkit auch dazu$.ajax
? Ich bin verwirrt.Hier ist ein sehr einfaches Javascript-Beispiel mit jQuery:
Dieser Benutzer meldet sich ab, ohne ihm das Anmeldefeld des Browsers erneut anzuzeigen, und leitet ihn dann auf eine abgemeldete Seite weiter
quelle
Dies ist mit der Basisauthentifizierung nicht direkt möglich.
In der HTTP-Spezifikation gibt es keinen Mechanismus für den Server, der den Browser anweist, das Senden der vom Benutzer bereits vorgelegten Anmeldeinformationen zu beenden.
Es gibt "Hacks" (siehe andere Antworten), bei denen normalerweise XMLHttpRequest zum Senden einer HTTP-Anforderung mit falschen Anmeldeinformationen verwendet wird, um die ursprünglich angegebenen zu überschreiben.
quelle
Dies funktioniert für IE / Netscape / Chrome:
quelle
Es ist eigentlich ziemlich einfach.
Besuchen Sie einfach Folgendes in Ihrem Browser und verwenden Sie falsche Anmeldeinformationen: http: // Benutzername: [email protected]
Das sollte "dich abmelden".
quelle
Sie müssen lediglich den Benutzer auf eine Abmelde-URL umleiten und einen
401 Unauthorized
Fehler zurückgeben. Auf der Fehlerseite (auf die ohne grundlegende Authentifizierung zugegriffen werden muss) müssen Sie einen vollständigen Link zu Ihrer Homepage (einschließlich Schema und Hostname) angeben. Der Benutzer klickt auf diesen Link und der Browser fragt erneut nach Anmeldeinformationen.Beispiel für Nginx:
Fehlerseite
/home/user/errors/401.html
:quelle
http_host
in401.html
statt einfach zu verwendenhost
, da ersterer auch die Portnummer hinzufügt (falls ein nicht standardmäßiger Port verwendet wird)quelle
quelle
Basierend auf dem, was ich oben gelesen habe, habe ich eine einfache Lösung erhalten, die in jedem Browser funktioniert:
1) Auf Ihrer Abmeldeseite rufen Sie einen Ajax für Ihr Login-Backend auf. Ihr Login-Backend muss den Logout-Benutzer akzeptieren. Sobald das Back-End akzeptiert, löscht der Browser den aktuellen Benutzer und übernimmt den Benutzer "Abmelden".
2) Wenn der Benutzer nun zur normalen Indexdatei zurückgekehrt ist, versucht er, automatisch mit dem Benutzer "Abmelden" in das System einzutreten. Beim zweiten Mal müssen Sie diese durch Antworten mit 401 blockieren, um den Anmelde- / Kennwortdialog aufzurufen.
3) Es gibt viele Möglichkeiten, dies zu tun. Ich habe zwei Login-Backends erstellt, eines, das den Logout-Benutzer akzeptiert, und eines, das dies nicht tut. Meine normale Anmeldeseite verwendet diejenige, die nicht akzeptiert, meine Abmeldeseite verwendet diejenige, die sie akzeptiert.
quelle
Ich habe gerade Folgendes in Chrome (79), Firefox (71) und Edge (44) getestet und es funktioniert einwandfrei. Es wendet die Skriptlösung wie die oben genannten an.
Fügen Sie einfach einen "Abmelden" -Link hinzu und geben Sie beim Klicken den folgenden HTML-Code zurück
quelle
Dieses JavaScript muss für alle Browser der neuesten Version funktionieren:
quelle
Fügen Sie dies Ihrer Anwendung hinzu:
quelle
Geben Sie
chrome://restart
die Adressleiste ein und Chrome mit all seinen Apps, die im Hintergrund ausgeführt werden, wird neu gestartet und der Auth-Passwort-Cache wird bereinigt.quelle
Nur für den Datensatz gibt es einen neuen HTTP-Antwortheader namens
Clear-Site-Data
. Wenn Ihre Serverantwort einenClear-Site-Data: "cookies"
Header enthält, sollten die Authentifizierungsdaten (nicht nur Cookies) entfernt werden. Ich habe es auf Chrome 77 getestet, aber diese Warnung wird auf der Konsole angezeigt:Und die Anmeldeinformationen für die Authentifizierung werden nicht entfernt, sodass dies (vorerst) nicht zum Implementieren grundlegender Authentifizierungsabmeldungen funktioniert, aber möglicherweise in Zukunft. Nicht in anderen Browsern getestet.
Verweise:
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
quelle
Das Senden
https://invalid_login@hostname
funktioniert überall gut, außer bei Safari auf dem Mac (naja, Edge ist nicht aktiviert, sollte aber auch dort funktionieren).Die Abmeldung funktioniert in Safari nicht, wenn ein Benutzer im Popup "HTTP-Basisauthentifizierung" die Option "Kennwort speichern" auswählt. In diesem Fall wird das Kennwort unter Schlüsselbundzugriff (Finder> Anwendungen> Dienstprogramme> Schlüsselbundzugriff (oder CMD + SPACE und geben Sie "Schlüsselbundzugriff")) gespeichert. Senden
https://invalid_login@hostname
hat keinen Einfluss auf den Schlüsselbundzugriff. Mit diesem Kontrollkästchen ist es daher nicht möglich, sich bei Safari auf dem Mac abzumelden. Zumindest funktioniert es bei mir so.MacOS Mojave (10.14.6), Safari 12.1.2.
Der folgende Code funktioniert gut für mich in Firefox (73), Chrome (80) und Safari (12). Wenn ein Benutzer zu einer Abmeldeseite navigiert, wird der Code ausgeführt und die Anmeldeinformationen werden gelöscht.
Aus irgendeinem Grund speichert Safari keine Anmeldeinformationen im Popup-Fenster "HTTP Basic Authentication", selbst wenn "Kennwort speichern" ausgewählt ist. Die anderen Browser machen das richtig.
quelle
quelle
Ich habe die Lösung von mthoring für moderne Chrome-Versionen aktualisiert:
quelle