Czy można wylogować użytkownika ze strony internetowej, jeśli korzysta on z podstawowego uwierzytelnienia?
Sesja zabijania nie wystarczy, ponieważ po uwierzytelnieniu użytkownika każde żądanie zawiera dane logowania, więc użytkownik jest automatycznie logowany przy następnym dostępie do witryny przy użyciu tych samych danych logowania.
Jak dotąd jedynym rozwiązaniem jest zamknięcie przeglądarki, ale z punktu widzenia użyteczności jest to nie do przyjęcia.
/
strony, zostaną automatycznie ponownie zalogowani.Odpowiedzi:
Podstawowe uwierzytelnianie nie zostało zaprojektowane do zarządzania wylogowaniem. Możesz to zrobić, ale nie całkowicie automatycznie.
Musisz tylko kliknąć link wylogowania i wysłać odpowiedź „401 Nieautoryzowany”, korzystając z tej samej dziedziny i na tym samym poziomie folderu URL, co zwykły numer 401 wysyłany z prośbą o zalogowanie.
Muszą zostać poproszeni o podanie nieprawidłowych danych uwierzytelniających, np. pusta nazwa użytkownika i hasło, a w odpowiedzi odsyłasz stronę „Wylogowanie się powiodło”. Błędne / puste poświadczenia zastąpią poprzednie poprawne poświadczenia.
Krótko mówiąc, skrypt wylogowania odwraca logikę skryptu logowania, zwracając stronę sukcesu tylko wtedy, gdy użytkownik nie przejdzie odpowiednich poświadczeń.
Pytanie brzmi, czy nieco dziwne okno hasła „nie wprowadzaj hasła” spotka się z akceptacją użytkownika. Menedżerowie haseł, którzy próbują automatycznie uzupełnić hasło, również mogą przeszkodzić tutaj.
Edytuj, aby dodać w odpowiedzi na komentarz: ponowne zalogowanie jest nieco innym problemem (chyba że potrzebujesz oczywiście dwuetapowego wylogowania / logowania). Musisz odrzucić (401) pierwszą próbę dostępu do linku ponownego logowania, niż zaakceptować drugą (która prawdopodobnie ma inną nazwę użytkownika / hasło). Można to zrobić na kilka sposobów. Jednym z nich byłoby dołączenie bieżącej nazwy użytkownika do linku wylogowania (np. / Relogin? Nazwa użytkownika) i odrzucenie, gdy poświadczenia są zgodne z nazwą użytkownika.
źródło
Dodatek do odpowiedzi bobince ...
Dzięki Ajax możesz połączyć link / przycisk „Wyloguj” z funkcją Javascript. Niech ta funkcja wyśle XMLHttpRequest z niepoprawną nazwą użytkownika i hasłem. To powinno odzyskać 401. Następnie ustaw document.location z powrotem na stronę przed logowaniem. W ten sposób użytkownik nigdy nie zobaczy dodatkowego okna logowania podczas wylogowywania, ani nie będzie musiał pamiętać o wprowadzeniu złych danych logowania.
źródło
Poproś użytkownika o kliknięcie linku do https: // log: [email protected]/ . Spowoduje to zastąpienie istniejących poświadczeń nieprawidłowymi; wylogowanie ich.
źródło
Możesz to zrobić całkowicie w JavaScript:
IE ma (przez długi czas) standardowy interfejs API do czyszczenia pamięci podręcznej podstawowego uwierzytelniania:
Powinien zwrócić wartość true, gdy działa. Zwraca wartość false, niezdefiniowany lub wysadza się w innych przeglądarkach.
Nowe przeglądarki (od grudnia 2012 r .: Chrome, FireFox, Safari) działają „magicznie”. Jeśli zobaczą udane podstawowe żądanie autoryzacji z dowolną inną fałszywą nazwą użytkownika (powiedzmy
logout
), usuwają pamięć podręczną poświadczeń i ewentualnie ustawiają ją dla tej nowej fałszywej nazwy użytkownika, którą musisz upewnić się, że nie jest prawidłową nazwą użytkownika do przeglądania treści.Podstawowym przykładem tego jest:
„Asynchronicznym” sposobem wykonania powyższego jest wykonanie wywołania AJAX przy użyciu
logout
nazwy użytkownika. Przykład:Możesz też zrobić z niego 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*/);
źródło
logout
nazwy użytkownika i / lub adresu URL wylogowania po stronie serwera ?logout
istnieje i ma wygenerowane hasło. W tym prawie niemożliwie rzadkim przypadku zmień identyfikator użytkownika na taki, który nie będzie istniał w twoim systemie.<a href='javascript:......need*/);'>Logout</a>
Potwierdzono działanie następującej funkcji dla Firefox 40, Chrome 44, Opera 31 i IE 11.
Bowser służy do wykrywania przeglądarki, jQuery jest również używany.
- secUrl to adres URL obszaru chronionego hasłem, z którego należy się wylogować.
- redirUrl to adres URL do obszaru niechronionego hasłem (strona udanego wylogowania).
- możesz zwiększyć czas przekierowania (obecnie 200 ms).
źródło
$.ajax
wariant jest synchroniczny (async: false
), axmlhttp
wariant jest asynchroniczny (true
inopen()
)?(bowser.gecko)
na(bowser.gecko || bowser.blink)
.$.ajax
i Webkitnew XMLHttpRequest
? Czy gecko / blink nie powinien być w stanie zrobić,XMLHttpRequest
a webkit$.ajax
także? Jestem zmieszany.Oto bardzo prosty przykład Javascript za pomocą jQuery:
Ten użytkownik dziennika bez pokazując mu przeglądarkę dziennika w oknie ponownie, a następnie przekierować go do wylogowany stronę
źródło
Nie jest to bezpośrednio możliwe w przypadku podstawowego uwierzytelnienia.
W specyfikacji HTTP nie ma mechanizmu informującego przeglądarkę, aby przestała wysyłać poświadczenia, które użytkownik już przedstawił.
Istnieją „włamania” (patrz inne odpowiedzi), zwykle polegające na użyciu XMLHttpRequest w celu wysłania żądania HTTP z niepoprawnymi danymi uwierzytelniającymi w celu zastąpienia oryginalnie podanych.
źródło
Działa to dla IE / Netscape / Chrome:
źródło
To jest właściwie całkiem proste.
Wystarczy odwiedzić stronę w przeglądarce i użyć nieprawidłowych danych logowania: http: // nazwa użytkownika: hasł[email protected]
To powinno „wylogować”.
źródło
Wystarczy przekierować użytkownika na adres URL wylogowania i zwrócić
401 Unauthorized
błąd. Na stronie błędu (która musi być dostępna bez podstawowego uwierzytelnienia) musisz podać pełny link do swojej strony głównej (w tym schemat i nazwę hosta). Użytkownik kliknie ten link, a przeglądarka ponownie poprosi o poświadczenia.Przykład dla Nginx:
Strona błędu
/home/user/errors/401.html
:źródło
http_host
w401.html
zamiast po prostuhost
, jako dawny dodaje również numer portu (w przypadku jest używany niestandardowy port)źródło
źródło
Na podstawie tego, co przeczytałem powyżej, otrzymałem proste rozwiązanie, które działa w dowolnej przeglądarce:
1) na stronie wylogowania wywołujesz ajax do swojego zaplecza logowania. Twój zaplecze logowania musi zaakceptować użytkownika wylogowania. Po zaakceptowaniu zaplecza przeglądarka wyczyści bieżącego użytkownika i przyjmie użytkownika „wylogowania”.
2) Teraz, gdy użytkownik powróci do normalnego pliku indeksu, spróbuje automatycznie wejść do systemu z użytkownikiem „wyloguj się”, po raz drugi musisz go zablokować, odpowiadając 401, aby wywołać okno dialogowe logowania / hasła.
3) Można to zrobić na wiele sposobów, utworzyłem dwa zaplecza logowania, jeden akceptujący użytkownika wylogowania, a drugi nie. Moja normalna strona logowania używa strony, która nie akceptuje, moja strona wylogowania używa strony, która ją akceptuje.
źródło
Właśnie przetestowałem następujące elementy w Chrome (79), Firefox (71) i Edge (44) i działa dobrze. Stosuje rozwiązanie skryptu, jak wspomniano powyżej.
Wystarczy dodać link „Wyloguj się”, a po kliknięciu zwróć następujący HTML
źródło
Ten JavaScript musi działać dla wszystkich przeglądarek najnowszej wersji:
źródło
dodaj to do swojej aplikacji:
źródło
wpisz
chrome://restart
pasek adresu i chrome, wszystkie aplikacje działające w tle, uruchomią się ponownie i pamięć podręczna haseł Auth zostanie wyczyszczona.źródło
Dla przypomnienia istnieje nowy nagłówek odpowiedzi HTTP o nazwie
Clear-Site-Data
. Jeśli odpowiedź serwera zawieraClear-Site-Data: "cookies"
nagłówek, dane uwierzytelniające (nie tylko pliki cookie) powinny zostać usunięte. Testowałem to na Chrome 77, ale to ostrzeżenie pojawia się na konsoli:Poświadczenia uwierzytelniania nie są usuwane, więc nie działa (na razie) w celu wdrożenia podstawowych wylogowań uwierzytelniania, ale być może w przyszłości tak się stanie. Nie testowałem w innych przeglądarkach.
Bibliografia:
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
źródło
Wysyłanie
https://invalid_login@hostname
działa dobrze wszędzie oprócz Safari na Macu (cóż, nie zaznaczone Edge, ale też powinno tam działać).Wylogowanie nie działa w przeglądarce Safari, gdy użytkownik wybierze opcję „zapamiętaj hasło” w wyskakującym okienku Uwierzytelnianie podstawowe HTTP. W takim przypadku hasło jest przechowywane w Dostępu do pęku kluczy (Finder> Aplikacje> Narzędzia> Dostęp do pęku kluczy (lub CMD + SPACJA i wpisz „Dostęp do pęku kluczy”)). Wysyłanie
https://invalid_login@hostname
nie wpływa na dostęp do pęku kluczy, więc dzięki temu polu wyboru nie można się wylogować w Safari na Macu. Przynajmniej tak to dla mnie działa.MacOS Mojave (10.14.6), Safari 12.1.2.
Poniższy kod działa dla mnie dobrze w Firefox (73), Chrome (80) i Safari (12). Gdy użytkownik przechodzi do strony wylogowania, kod jest wykonywany i upuszcza poświadczenia.
Również z jakiegoś powodu Safari nie zapisuje poświadczeń w wyskakującym okienku Podstawowego uwierzytelniania HTTP, nawet jeśli wybrano „zapamiętaj hasło”. Inne przeglądarki robią to poprawnie.
źródło
źródło
Zaktualizowałem rozwiązanie mthoringu dla nowoczesnych wersji Chrome:
źródło