Можно ли выйти из системы с веб-сайта, если он использует обычную аутентификацию?
Сеанса убийства недостаточно, поскольку после аутентификации пользователя каждый запрос содержит информацию для входа в систему, поэтому пользователь автоматически регистрируется при следующем доступе к сайту с использованием тех же учетных данных.
Пока единственное решение - закрыть браузер, но это неприемлемо с точки зрения удобства использования.
/
страницы, они автоматически снова войдут в систему.Ответы:
Обычная аутентификация не предназначена для управления выходом из системы. Вы можете сделать это, но не полностью автоматически.
Вам нужно сделать так, чтобы пользователь щелкнул ссылку выхода из системы и отправил «401 Unauthorized» в ответ, используя ту же область и тот же уровень URL-папки, что и обычный 401, который вы отправляете, запрашивая вход в систему.
Они должны быть направлены на ввод неправильных учетных данных, например. пустое имя пользователя и пароль, и в ответ вы отправляете обратно страницу «Вы успешно вышли из системы». Неверные / пустые учетные данные затем перезапишут предыдущие правильные учетные данные.
Короче говоря, сценарий выхода из системы инвертирует логику сценария входа в систему, возвращая страницу успеха, только если пользователь не передает правильные учетные данные.
Вопрос заключается в том, будет ли одобренное пользователем поле для ввода пароля «не вводить пароль». Менеджеры паролей, которые пытаются автоматически заполнить пароль, также могут помешать здесь.
Отредактируйте, чтобы добавить в ответ на комментарий: повторный вход в систему - это немного другая проблема (если, конечно, вам не требуется двухэтапный выход из системы / вход в систему). Вы должны отклонить (401) первую попытку доступа к ссылке повторной регистрации, чем принять вторую (которая предположительно имеет другое имя пользователя / пароль). Есть несколько способов сделать это. Можно было бы включить текущее имя пользователя в ссылку выхода из системы (например, / relogin? Username) и отклонить, когда учетные данные соответствуют имени пользователя.
источник
Дополнение к ответу от bobince ...
С Ajax вы можете привязать ссылку / кнопку «Выход» к функции Javascript. Пусть эта функция отправит XMLHttpRequest с неверным именем пользователя и паролем. Это должно вернуть 401. Затем верните document.location на страницу перед входом в систему. Таким образом, пользователь никогда не увидит дополнительное диалоговое окно входа в систему и не должен будет вводить неверные учетные данные.
источник
Попросите пользователя щелкнуть ссылку на https: // log: out@example.com/ . Это заменит существующие учетные данные недействительными; выходя из них.
источник
Вы можете сделать это полностью в JavaScript:
IE имеет (долгое время) стандартный API для очистки кэша базовой аутентификации:
Должен вернуть true, когда это работает. Возвращает либо false, undefined, либо взрывается в других браузерах.
Новые браузеры (по состоянию на декабрь 2012 года: Chrome, FireFox, Safari) имеют «магическое» поведение. Если они видят успешный базовый запрос авторизации с любым поддельным другим именем пользователя (скажем
logout
), они очищают кэш учетных данных и, возможно, устанавливают его для этого нового поддельного имени пользователя, которое необходимо убедиться, что это недопустимое имя пользователя для просмотра содержимого.Основной пример этого:
«Асинхронный» способ сделать это - выполнить AJAX-вызов с использованием имени
logout
пользователя. Пример:Вы также можете сделать это букмарклетом:
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*/);
источник
logout
пользователя и / или выхода из системы?logout
существует и имеет сгенерированный пароль. В этом почти невозможном случае измените идентификатор пользователя на тот, который не существует в вашей системе.<a href='javascript:......need*/);'>Logout</a>
Подтверждено, что следующая функция работает для Firefox 40, Chrome 44, Opera 31 и IE 11.
Bowser используется для обнаружения в браузере, также используется jQuery.
- secUrl - это URL защищенной паролем области, из которой можно выйти.
- redirUrl - это URL для незащищенной паролем области (страница успешного выхода из системы).
- Вы можете увеличить таймер перенаправления (в настоящее время 200 мс).
источник
$.ajax
варианта, являющегося синхронным (async: false
), иxmlhttp
вариант, являющийся асинхронным (true
inopen()
)?(bowser.gecko)
на(bowser.gecko || bowser.blink)
.$.ajax
и Webkit используетnew XMLHttpRequest
? Разве gecko / blink не должен быть в состоянии сделать,XMLHttpRequest
и webkit должен быть в состоянии сделать$.ajax
тоже самое? Я запутался.Вот очень простой пример Javascript с использованием jQuery:
Этот пользователь выходит из системы, не показывая ему снова окно входа в браузер, а затем перенаправляет его на страницу выхода из системы.
источник
Это невозможно напрямую с Basic-Authentication.
В спецификации HTTP нет механизма для сервера, который бы указывал браузеру прекратить отправку учетных данных, которые пользователь уже представил.
Существуют «хаки» (см. Другие ответы), обычно включающие использование XMLHttpRequest для отправки HTTP-запроса с неверными учетными данными, чтобы перезаписать первоначально предоставленные.
источник
Это работает для IE / Netscape / Chrome:
источник
Это на самом деле довольно просто.
Просто зайдите в браузер и используйте неверные учетные данные: http: // username: password@yourdomain.com
Это должно "выйти из системы".
источник
Все, что вам нужно, это перенаправить пользователя на некоторый URL-адрес выхода и вернуть
401 Unauthorized
ошибку на нем. На странице ошибок (которая должна быть доступна без базовой аутентификации) вам необходимо предоставить полную ссылку на вашу домашнюю страницу (включая схему и имя хоста). Пользователь перейдет по этой ссылке, и браузер снова запросит учетные данные.Пример для Nginx:
Страница ошибки
/home/user/errors/401.html
:источник
http_host
в401.html
вместо того , чтобы простоhost
, как бывшие также добавляет номер порта (в случае нестандартный порт используется)источник
источник
Исходя из того, что я прочитал выше, я получил простое решение, которое работает в любом браузере:
1) на своей странице выхода вы вызываете ajax для своей учетной записи. Ваш бэкэнд должен принять пользователя из системы. Как только бэкэнд примет, браузер очищает текущего пользователя и принимает пользователя "выхода из системы".
2) Теперь, когда пользователь вернулся к обычному индексному файлу, он попытается автоматически войти в систему с пользователем «logout», в этот второй раз вы должны заблокировать его с помощью ответа 401, чтобы вызвать диалог логина / пароля.
3) Есть много способов сделать это, я создал два бэкэнда входа в систему, один из которых принимает пользователя, а другой нет. Моя обычная страница входа использует ту, которая не принимает, моя страница выхода использует ту, которая ее принимает.
источник
Я только что проверил следующее в Chrome (79), Firefox (71) и Edge (44), и он отлично работает. Это применяет решение сценария как другие отмеченные выше.
Просто добавьте ссылку «Выйти» и при нажатии верните следующий HTML
источник
Этот JavaScript должен работать для всех браузеров последней версии:
источник
добавьте это в ваше приложение:
источник
введите
chrome://restart
в адресную строку, и Chrome, со всеми его приложениями, работающими в фоновом режиме, перезапустится, и кэш пароля аутентификации будет очищен.источник
Просто для записи есть новый заголовок ответа HTTP
Clear-Site-Data
. Если ваш ответ сервера содержитClear-Site-Data: "cookies"
заголовок, то учетные данные для аутентификации (не только файлы cookie) должны быть удалены. Я тестировал его на Chrome 77, но на консоли отображается это предупреждение:И учетные данные аутентификации не удаляются, поэтому это не работает (пока) для реализации основных выходов из системы аутентификации, но, возможно, в будущем это удастся. Не тестировал в других браузерах.
Ссылки:
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
источник
Отправка
https://invalid_login@hostname
работает отлично везде, кроме Safari на Mac (ну, не проверенный Edge, но и там тоже должен работать).Выход из системы не работает в Safari, когда пользователь выбирает «запомнить пароль» во всплывающем окне «Базовая аутентификация HTTP». В этом случае пароль хранится в Доступе по цепочке для ключей (Finder> Приложения> Утилиты> Доступ по цепочке для ключей (или CMD + SPACE и введите «Доступ к цепочке для ключей»)). Отправка
https://invalid_login@hostname
не влияет на Keychain Access, поэтому с этим флажком невозможно выйти из Safari на Mac. По крайней мере, так у меня работает.MacOS Mojave (10.14.6), Safari 12.1.2.
Приведенный ниже код отлично работает для меня в Firefox (73), Chrome (80) и Safari (12). Когда пользователь переходит на страницу выхода из системы, код выполняется и удаляет учетные данные.
Также по какой-то причине Safari не сохраняет учетные данные во всплывающем окне «Базовая аутентификация HTTP», даже если выбран «запомнить пароль». Другие браузеры делают это правильно.
источник
источник
Я обновил решение mthoring для современных версий Chrome:
источник