Http basic authentication "log out"

Базовые аутентификационные данные HTTP хранятся до закрытия браузера, но есть ли способ удалить учетные данные до закрытия браузера?

Я читал о трюке с кодом статуса HTTP 401, но он выглядит не работает должным образом ( см. комментарий к ответу). Возможно, механизм trac использует это решение.

Можно ли удалить учетные данные с помощью JavaScript? Или с комбинацией JavaScript и трюком статуса 401?

Ответ 1

Обновление. Это решение, похоже, больше не работает во многих браузерах. Комментарий Kaitsu:

Это решение отправки ложных учетных данных, чтобы браузер забыл правильные аутентифицированные учетные данные, не работает в Chrome (16) и IE (9). Работает в Firefox (9).


На самом деле вы можете реализовать обходное решение, отправив ложные учетные данные службе. Это работает в браузерах, отправив другое (несуществующее?) Имя пользователя без пароля. Браузер теряет информацию об аутентифицированных учетных данных.

Пример:

https://www.example.com/ = > Войти с базовым auth как "user1"

Теперь откройте

https://[email protected]/

Вы вышли из системы.;)

Привет

P.s.: Но, пожалуйста, проверьте это со всеми необходимыми браузерами, прежде чем полагаться на данную информацию.

Ответ 2

Расширение ответа на январь и обновление ответа owyongsk:

Вот пример кода jquery java- script, который заставит браузер по существу отправить ложный запрос на вход на страницу, которую вы пытаетесь защитить, что во всех проверенных браузерах привело к удалению кэшированных учетных данных, а затем перенаправляет пользователя на незащищенную страницу.

Предупреждение(), когда что-то пойдет не так, вероятно, должно быть изменено на что-то еще.

//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 = "/";
    });
}

Тогда это было так же просто, как просто вызвать ссылку для выхода из функции logout(), и она, казалось, легко работала с пользователем, хотя она по-прежнему технически является хакерским заданием.

Ответ 3

Вы можете попробовать хак, который работает в настоящий момент с последними Chrome и Firefox. Создайте страницу "/logout" на вашем сервере, которая принимает только определенные учетные данные, такие как имя пользователя: false, пароль: false. Затем, используя этот запрос AJAX ниже, вы можете отправить пользователя на эту страницу.

  $("#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");                                              
  });

Случается, что ложное имя пользователя и пароль кэшируются из действительного XMLHttpRequest вместо текущих учетных данных пользователя, а когда пользователь пытается войти на любую страницу, он будет использовать кэшированные поддельные учетные данные, не получив аутентификацию, попросите пользователя ввести другой. Надеюсь, это поможет!

Ответ 4

только что завершив реализацию, которая отлично работала для меня: На сервере я оцениваю сеанс, имя пользователя и пароль, поэтому я отслеживаю эту информацию, алгоритм входа в систему выглядит следующим образом:

1. Проверьте, не являются ли пользователь и пароль пустым, иначе верните 401.

2.Проверьте, зарегистрировали ли мы сеанс в нашем списке зарегистрированных пользователей, если нет, то проверьте, действительно ли пользователь и пароль действительны, и если так сохранить идентификатор сеанса в нашем списке, а затем верните 401. Я объясню этот шаг: если идентификатор сеанса отличается от одного из трех событий:   a) Пользователь открывает другое окно.   б) Сеанс пользователя завершен, т.е. пользователь вышел из системы.   c) Сессия закончилась из-за бездействия. Но мы хотим сохранить сеанс до тех пор, пока учетные данные пользователя действительны, но верните 401, чтобы спросить пароль один раз, если мы не сохраним сеанс, тогда пользователь никогда не сможет войти в систему, потому что у нас нет нового идентификатора сеанса в нашем списке.

3. Проверьте правильность учетных данных пользователя, если это так, сохраните информацию о сеансе и продолжите страницы обслуживания, а затем верните 401.

Итак, единственное, что я должен выйти из системы, - закрыть сеанс на сервере, когда пользователь запросит страницу выхода, и веб-браузер снова отобразит диалоговое окно входа.

Я думаю, что, когда я пишу это, должен быть шаг, когда программа проверяет, что пользователь уже зарегистрирован, чтобы избежать олицетворения, возможно, я могу сохранить более одного идентификатора сеанса для каждого пользователя, чтобы разрешить несколько сеансов, Я хотел бы получить ваши комментарии по этому поводу.

Надеюсь, что вы поймете эту идею и прокомментируете, если вы видите недостаток безопасности;)

Ответ 5

Вы можете удалить учетные данные с помощью JavaScript:

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

Этот код работает только в IE. Вот почему там добавлен блок try/catch. Кроме того, по той же причине ссылка на выход, которую вы должны показывать только для пользователей IE:

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

И для других пользователей мое предложение выглядит примерно так:

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

Ответ 6

Если у вас есть контроль над кодом сервера, вы можете создать функцию "logout", которая отвечает "401 Unauthorized" независимо от предоставленных учетных данных. Этот отказ заставляет браузеры удалять сохраненные учетные данные.

Я только что протестировал это с помощью Chrome 34, IE 11, Firefox 25 - используя сервер Express.js и базовую аутентификацию HTTP.

Ответ 7

Что для меня работало в Chrome (версия 66) - это отправить запрос Ajax на URL-адрес, который возвращает 401. Таким образом, базовый кеш аутентификации, кажется, очищается.

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