http базовая аутентификация "Выйти" - PullRequest
60 голосов
/ 12 ноября 2010

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

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

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

Ответы [ 7 ]

33 голосов
/ 12 ноября 2010

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

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


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

Пример:

https://www.example.com/ => Войти с базовой аутентификацией как "user1"

Открыто

https://foobar@www.example.com/

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

Привет

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

10 голосов
/ 18 мая 2015

Расширение ответа Яна и обновление ответа Овёнска:

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

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

//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 (), и, казалось, она работала без проблем для пользователя, хотя технически это все еще хакерская работа.

7 голосов
/ 07 июня 2013

Вы можете попробовать взломать, который работает в данный момент с последними Chrome и Firefox.Создайте на своем сервере страницу «/ logout», которая принимает только определенные учетные данные, такие как имя пользователя: ложь, пароль: ложь.Затем, используя приведенный ниже 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 голосов
/ 11 июня 2012

Вы можете удалить учетные данные с помощью 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>
4 голосов
/ 30 июля 2011

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

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

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

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

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

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

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

3 голосов
/ 30 мая 2014

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

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

0 голосов
/ 26 апреля 2018

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

...