Как выйти из системы с помощью BASIC-аутентификации?

279

Можно ли выйти из системы с веб-сайта, если он использует обычную аутентификацию?

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

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

Marko
источник
1
Просто любопытно. почему ты хочешь сделать это?
DOK
17
Чтобы иметь возможность войти в систему как другой пользователь.
Марко
16
@DOK - это стандартная социальная система: пользователи должны иметь возможность выйти из системы, оставив браузер открытым. Предположим, один из ваших пользователей заходит на сайт на общедоступной машине? Они должны явно выйти из системы, чтобы следующий пользователь не мог получить доступ к сайту, как они.
Кит
@ DOK Существует также проблема, которая делает невозможным для пользователя выход из системы. Сервер может очистить куки авторизации и даже куки сессии. Но когда браузер перейдет к загрузке /страницы, они автоматически снова войдут в систему.
Ян Бойд
Я использовал метод, который отправляет ложный запрос на выход из системы, но он блокирует пользователя в клиенте, поскольку существует строгое ограничение, состоящее в том, что 3 раза вход в AD был неудачным. Поэтому рекомендуем использовать этот метод (отправить поддельный запрос) с осторожностью.
Цяньчао Пан

Ответы:

170

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

Вам нужно сделать так, чтобы пользователь щелкнул ссылку выхода из системы и отправил «401 Unauthorized» в ответ, используя ту же область и тот же уровень URL-папки, что и обычный 401, который вы отправляете, запрашивая вход в систему.

Они должны быть направлены на ввод неправильных учетных данных, например. пустое имя пользователя и пароль, и в ответ вы отправляете обратно страницу «Вы успешно вышли из системы». Неверные / пустые учетные данные затем перезапишут предыдущие правильные учетные данные.

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

Вопрос заключается в том, будет ли одобренное пользователем поле для ввода пароля «не вводить пароль». Менеджеры паролей, которые пытаются автоматически заполнить пароль, также могут помешать здесь.

Отредактируйте, чтобы добавить в ответ на комментарий: повторный вход в систему - это немного другая проблема (если, конечно, вам не требуется двухэтапный выход из системы / вход в систему). Вы должны отклонить (401) первую попытку доступа к ссылке повторной регистрации, чем принять вторую (которая предположительно имеет другое имя пользователя / пароль). Есть несколько способов сделать это. Можно было бы включить текущее имя пользователя в ссылку выхода из системы (например, / relogin? Username) и отклонить, когда учетные данные соответствуют имени пользователя.

bobince
источник
2
Я попробую этот подход. Смысл выхода из системы (в данном случае) состоит в том, чтобы позволить пользователю войти в систему как другой пользователь, поэтому это вполне приемлемое решение. Что касается автозаполнения пароля, это зависит от пользователя, будет ли он использовать его или нет. Спасибо
Марко
Это все еще единственный путь? Я сделал ASP.Net MVC и реализацию jQuery, которая работает, но я все еще не доволен этим: stackoverflow.com/questions/6277919
Кит
@Keith: Все еще только это и ответ systemPAUSE (который работает не во всех браузерах, но более плавный, чем ручной подход, когда он работает).
бобинце
16
W3C так активен в спецификации HTML. Но HTTP-спецификация томна. W3C должен был решить эту проблему около двух десятилетий назад. С ростом использования сервисов REST необходим надежный метод аутентификации.
Додзё
9
Это не работает должным образом в браузере Chrome 46 на localhost. Chrome сохраняет старый (правильный) пароль и новый пароль, который вы укажете. После перехода на страницу выхода из системы, Chrome правильно использует новый пароль, пока он не встретится с 401, которые не авторизованы на странице вашего сайта. После первых 401 Chrome возвращается к старому (правильному) паролю. Так что это действительно не удаляло пароль, во-первых, это кажется.
vancan1ty
196

Дополнение к ответу от bobince ...

С Ajax вы можете привязать ссылку / кнопку «Выход» к функции Javascript. Пусть эта функция отправит XMLHttpRequest с неверным именем пользователя и паролем. Это должно вернуть 401. Затем верните document.location на страницу перед входом в систему. Таким образом, пользователь никогда не увидит дополнительное диалоговое окно входа в систему и не должен будет вводить неверные учетные данные.

системная пауза
источник
12
Хороший взлом, когда пользователь вводит неверные учетные данные вручную, вероятно, не подходит для большинства веб-приложений.
BillMan
1
Просто убедитесь, что XMLHttpRequest не установлен как асинхронный, или вы можете обнаружить, что перенаправление через произойдет до завершения запроса на выход из системы.
Давиджб
5
Вы можете использовать тот же трюк для входа в систему. Таким образом, вы можете настроить диалог входа в систему без необходимости изменения метода аутентификации сервера. Эта статья дает несколько хороших идей: http://www.peej.co.uk/articles/http-auth-with-html-forms.html
Stijn de Witt
1
@davidjb Поскольку синхронные запросы в настоящее время считаются устаревшими, альтернативным решением может быть перенаправление пользователя в обратном вызове асинхронного запроса.
Хайден Шифф
1
Дэвид: Chrome теперь разрешает это для XHR, и я могу подтвердить, что он все еще работает в Chrome Canary. bugs.chromium.org/p/chromium/issues/detail?id=435547
CpnCrunch
192

Попросите пользователя щелкнуть ссылку на https: // log: out@example.com/ . Это заменит существующие учетные данные недействительными; выходя из них.

Мэтью Велборн
источник
19
Почему этот не получает больше голосов? Похоже, простое и рабочее решение для меня. Есть ли известные проблемы с этим подходом?
Amoebe
35
Это больше не будет работать в Chrome, который по соображениям безопасности игнорирует учетные данные в URL.
Том
5
Это сработало для меня :) Я использую Chrome версии 32.0.1700.102
abottoni
6
проблема: при использовании Chrome версии 39.0. Когда я нажимаю ссылку выхода из системы с помощью этого метода, Chrome запоминает неверные учетные данные для входа и запрашивает новые учетные данные для входа при каждой загрузке страницы, пока я не перехожу на example.com без каких-либо указанных учетных данных для входа, чтобы очистить память Chrome.
Скотт
4
Привет, я не могу использовать его для https на Chrome.
thienkhoi тран
67

Вы можете сделать это полностью в JavaScript:

IE имеет (долгое время) стандартный API для очистки кэша базовой аутентификации:

document.execCommand("ClearAuthenticationCache")

Должен вернуть true, когда это работает. Возвращает либо false, undefined, либо взрывается в других браузерах.

Новые браузеры (по состоянию на декабрь 2012 года: Chrome, FireFox, Safari) имеют «магическое» поведение. Если они видят успешный базовый запрос авторизации с любым поддельным другим именем пользователя (скажем logout), они очищают кэш учетных данных и, возможно, устанавливают его для этого нового поддельного имени пользователя, которое необходимо убедиться, что это недопустимое имя пользователя для просмотра содержимого.

Основной пример этого:

var p = window.location.protocol + '//'
// current location must return 200 OK for this GET
window.location = window.location.href.replace(p, p + 'logout:password@')

«Асинхронный» способ сделать это - выполнить AJAX-вызов с использованием имени logoutпользователя. Пример:

(function(safeLocation){
    var outcome, u, m = "You should be logged out now.";
    // IE has a simple solution for it - API:
    try { outcome = document.execCommand("ClearAuthenticationCache") }catch(e){}
    // Other browsers need a larger solution - AJAX call with special user name - 'logout'.
    if (!outcome) {
        // Let's create an xmlhttp object
        outcome = (function(x){
            if (x) {
                // the reason we use "random" value for password is 
                // that browsers cache requests. changing
                // password effectively behaves like cache-busing.
                x.open("HEAD", safeLocation || location.href, true, "logout", (new Date()).getTime().toString())
                x.send("")
                // x.abort()
                return 1 // this is **speculative** "We are done." 
            } else {
                return
            }
        })(window.XMLHttpRequest ? new window.XMLHttpRequest() : ( window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : u ))
    }
    if (!outcome) {
        m = "Your browser is too old or too weird to support log out functionality. Close all windows and restart the browser."
    }
    alert(m)
    // return !!outcome
})(/*if present URI does not return 200 OK for GET, set some other 200 OK location here*/)

Вы также можете сделать это букмарклетом:

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*/);

ddotsenko
источник
1
Требует ли это специальной обработки на стороне сервера имени logoutпользователя и / или выхода из системы?
ulidtko
1
@ulidtko Нет, не должно - вся обработка выполняется на стороне клиента. Единственная ситуация, которая требует особой обработки, - это то, что вызванный пользователь logoutсуществует и имеет сгенерированный пароль. В этом почти невозможном случае измените идентификатор пользователя на тот, который не существует в вашей системе.
Давиджб
2
Сегодня я использовал букмарклет выше, и я хорошо работаю.
Дэвид Глеба
Я использовал это, и это работало для Chrome и FF. Мне только нужно было сделать дополнительный «GET» на моей странице logout.php, чтобы очистить $ _SESSION.
городской
2
Букмарклет работает и на Edge. Просто используйте с<a href='javascript:......need*/);'>Logout</a>
Эрик
21

Подтверждено, что следующая функция работает для Firefox 40, Chrome 44, Opera 31 и IE 11.
Bowser используется для обнаружения в браузере, также используется jQuery.

- secUrl - это URL защищенной паролем области, из которой можно выйти.
- redirUrl - это URL для незащищенной паролем области (страница успешного выхода из системы).
- Вы можете увеличить таймер перенаправления (в настоящее время 200 мс).

function logout(secUrl, redirUrl) {
    if (bowser.msie) {
        document.execCommand('ClearAuthenticationCache', 'false');
    } else if (bowser.gecko) {
        $.ajax({
            async: false,
            url: secUrl,
            type: 'GET',
            username: 'logout'
        });
    } else if (bowser.webkit) {
        var xmlhttp = new XMLHttpRequest();
        xmlhttp.open("GET", secUrl, true);
        xmlhttp.setRequestHeader("Authorization", "Basic logout");
        xmlhttp.send();
    } else {
        alert("Logging out automatically is unsupported for " + bowser.name
            + "\nYou must close the browser to log out.");
    }
    setTimeout(function () {
        window.location.href = redirUrl;
    }, 200);
}

mthoring
источник
это самый полный ответ
belidzs
Есть ли причина для $.ajaxварианта, являющегося синхронным ( async: false), и xmlhttpвариант, являющийся асинхронным ( truein open())?
Боуи
1
Chrome теперь использует движок рендеринга Blink, поэтому вам нужно перейти (bowser.gecko)на (bowser.gecko || bowser.blink).
Боуи
1
Почему Gecko / Blink использует $.ajaxи Webkit использует new XMLHttpRequest? Разве gecko / blink не должен быть в состоянии сделать, XMLHttpRequestи webkit должен быть в состоянии сделать $.ajaxтоже самое? Я запутался.
RemyNL
11

Вот очень простой пример Javascript с использованием jQuery:

function logout(to_url) {
    var out = window.location.href.replace(/:\/\//, '://log:out@');

    jQuery.get(out).error(function() {
        window.location = to_url;
    });
}

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

Ромуальд Брюне
источник
1
window.location = window.location.href.replace (/: \ / \ //, ': // log: out @');
себаза
10

Это невозможно напрямую с Basic-Authentication.

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

Существуют «хаки» (см. Другие ответы), обычно включающие использование XMLHttpRequest для отправки HTTP-запроса с неверными учетными данными, чтобы перезаписать первоначально предоставленные.

Альнитак
источник
12
Теоретически. Практика доказывает обратное, что видно из других ответов.
Стейн де Витт
2
И как вы можете видеть из других ответов, не надежным, последовательным и отказоустойчивым способом!
jplandrain
5

Это работает для IE / Netscape / Chrome:

      function ClearAuthentication(LogOffPage) 
  {
     var IsInternetExplorer = false;    

     try
     {
         var agt=navigator.userAgent.toLowerCase();
         if (agt.indexOf("msie") != -1) { IsInternetExplorer = true; }
     }
     catch(e)
     {
         IsInternetExplorer = false;    
     };

     if (IsInternetExplorer) 
     {
        // Logoff Internet Explorer
        document.execCommand("ClearAuthenticationCache");
        window.location = LogOffPage;
     }
     else 
     {
        // Logoff every other browsers
    $.ajax({
         username: 'unknown',
         password: 'WrongPassword',
             url: './cgi-bin/PrimoCgi',
         type: 'GET',
         beforeSend: function(xhr)
                 {
            xhr.setRequestHeader("Authorization", "Basic AAAAAAAAAAAAAAAAAAA=");
         },

                 error: function(err)
                 {
                    window.location = LogOffPage;
             }
    });
     }
  }


  $(document).ready(function () 
  {
      $('#Btn1').click(function () 
      {
         // Call Clear Authentication 
         ClearAuthentication("force_logout.html"); 
      });
  });          
Claudio
источник
5

Это на самом деле довольно просто.

Просто зайдите в браузер и используйте неверные учетные данные: http: // username: password@yourdomain.com

Это должно "выйти из системы".

Chiedo
источник
1
Но пользователь должен быть РЕАЛЬНЫМ, иначе я получил «401 Unauthorized», но с помощью кнопки «BACK» я могу продолжить работу как ранее зарегистрированный пользователь. Протестировано на веб-сервере Abyss X1 (2.11.1)
user2956477
1
Дублирующий ответ (см. Мэтью Уэлборн выше).
Скиппи ле Гран Гуру
3

Все, что вам нужно, это перенаправить пользователя на некоторый URL-адрес выхода и вернуть 401 Unauthorizedошибку на нем. На странице ошибок (которая должна быть доступна без базовой аутентификации) вам необходимо предоставить полную ссылку на вашу домашнюю страницу (включая схему и имя хоста). Пользователь перейдет по этой ссылке, и браузер снова запросит учетные данные.

Пример для Nginx:

location /logout {
    return 401;
}

error_page 401 /errors/401.html;

location /errors {
    auth_basic off;
    ssi        on;
    ssi_types  text/html;
    alias /home/user/errors;
}

Страница ошибки /home/user/errors/401.html:

<!DOCTYPE html>
<p>You're not authorised. <a href="<!--# echo var="scheme" -->://<!--# echo var="host" -->/">Login</a>.</p>
Envek
источник
Я хотел бы далее предложить использовать http_hostв 401.htmlвместо того , чтобы просто host, как бывшие также добавляет номер порта (в случае нестандартный порт используется)
Эмиль Koutanov
2
function logout() {
  var userAgent = navigator.userAgent.toLowerCase();

  if (userAgent.indexOf("msie") != -1) {
    document.execCommand("ClearAuthenticationCache", false);
  }

  xhr_objectCarte = null;

  if(window.XMLHttpRequest)
    xhr_object = new XMLHttpRequest();
  else if(window.ActiveXObject)
    xhr_object = new ActiveXObject("Microsoft.XMLHTTP");
  else
    alert ("Your browser doesn't support XMLHTTPREQUEST");

  xhr_object.open ('GET', 'http://yourserver.com/rep/index.php', false, 'username', 'password');
  xhr_object.send ("");
  xhr_object = null;

  document.location = 'http://yourserver.com'; 
  return false;
}
Чарли
источник
2
 function logout(url){
    var str = url.replace("http://", "http://" + new Date().getTime() + "@");
    var xmlhttp;
    if (window.XMLHttpRequest) xmlhttp=new XMLHttpRequest();
    else xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
    xmlhttp.onreadystatechange=function()
    {
        if (xmlhttp.readyState==4) location.reload();
    }
    xmlhttp.open("GET",str,true);
    xmlhttp.setRequestHeader("Authorization","Basic xxxxxxxxxx")
    xmlhttp.send();
    return false;
}
Сушован Мукерджи
источник
2

Исходя из того, что я прочитал выше, я получил простое решение, которое работает в любом браузере:

1) на своей странице выхода вы вызываете ajax для своей учетной записи. Ваш бэкэнд должен принять пользователя из системы. Как только бэкэнд примет, браузер очищает текущего пользователя и принимает пользователя "выхода из системы".

$.ajax({
    async: false,
    url: 'http://your_login_backend',
    type: 'GET',
    username: 'logout'
});      

setTimeout(function () {
    window.location.href = 'http://normal_index';
}, 200);

2) Теперь, когда пользователь вернулся к обычному индексному файлу, он попытается автоматически войти в систему с пользователем «logout», в этот второй раз вы должны заблокировать его с помощью ответа 401, чтобы вызвать диалог логина / пароля.

3) Есть много способов сделать это, я создал два бэкэнда входа в систему, один из которых принимает пользователя, а другой нет. Моя обычная страница входа использует ту, которая не принимает, моя страница выхода использует ту, которая ее принимает.

Foad
источник
2

Я только что проверил следующее в Chrome (79), Firefox (71) и Edge (44), и он отлично работает. Это применяет решение сценария как другие отмеченные выше.

Просто добавьте ссылку «Выйти» и при нажатии верните следующий HTML

    <div>You have been logged out. Redirecting to home...</div>    

<script>
    var XHR = new XMLHttpRequest();
    XHR.open("GET", "/Home/MyProtectedPage", true, "no user", "no password");
    XHR.send();

    setTimeout(function () {
        window.location.href = "/";
    }, 3000);
</script>
Тео Бебекис
источник
1

Этот JavaScript должен работать для всех браузеров последней версии:

//Detect Browser
var isOpera = !!window.opera || navigator.userAgent.indexOf(' OPR/') >= 0;
    // Opera 8.0+ (UA detection to detect Blink/v8-powered Opera)
var isFirefox = typeof InstallTrigger !== 'undefined';   // Firefox 1.0+
var isSafari = Object.prototype.toString.call(window.HTMLElement).indexOf('Constructor') > 0;
    // At least Safari 3+: "[object HTMLElementConstructor]"
var isChrome = !!window.chrome && !isOpera;              // Chrome 1+
var isIE = /*@cc_on!@*/false || !!document.documentMode; // At least IE6
var Host = window.location.host;


//Clear Basic Realm Authentication
if(isIE){
//IE
    document.execCommand("ClearAuthenticationCache");
    window.location = '/';
}
else if(isSafari)
{//Safari. but this works mostly on all browser except chrome
    (function(safeLocation){
        var outcome, u, m = "You should be logged out now.";
        // IE has a simple solution for it - API:
        try { outcome = document.execCommand("ClearAuthenticationCache") }catch(e){}
        // Other browsers need a larger solution - AJAX call with special user name - 'logout'.
        if (!outcome) {
            // Let's create an xmlhttp object
            outcome = (function(x){
                if (x) {
                    // the reason we use "random" value for password is 
                    // that browsers cache requests. changing
                    // password effectively behaves like cache-busing.
                    x.open("HEAD", safeLocation || location.href, true, "logout", (new Date()).getTime().toString())
                    x.send("");
                    // x.abort()
                    return 1 // this is **speculative** "We are done." 
                } else {
                    return
                }
            })(window.XMLHttpRequest ? new window.XMLHttpRequest() : ( window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : u )) 
        }
        if (!outcome) {
            m = "Your browser is too old or too weird to support log out functionality. Close all windows and restart the browser."
        }
        alert(m);
        window.location = '/';
        // return !!outcome
    })(/*if present URI does not return 200 OK for GET, set some other 200 OK location here*/)
}
else{
//Firefox,Chrome
    window.location = 'http://log:out@'+Host+'/';
}
Амит Шах
источник
1

добавьте это в ваше приложение:

@app.route('/logout')
def logout():
    return ('Logout', 401, {'WWW-Authenticate': 'Basic realm="Login required"'})
Амир Мофахар
источник
лучше использовать этот возврат: return («Выход», 401)
Амир Мофахар
1

введите chrome://restartв адресную строку, и Chrome, со всеми его приложениями, работающими в фоновом режиме, перезапустится, и кэш пароля аутентификации будет очищен.

Али
источник
1

Просто для записи есть новый заголовок ответа HTTP Clear-Site-Data. Если ваш ответ сервера содержит Clear-Site-Data: "cookies"заголовок, то учетные данные для аутентификации (не только файлы cookie) должны быть удалены. Я тестировал его на Chrome 77, но на консоли отображается это предупреждение:

Clear-Site-Data header on 'https://localhost:9443/clear': Cleared data types:
"cookies". Clearing channel IDs and HTTP authentication cache is currently not
supported, as it breaks active network connections.

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

Ссылки:

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

Науэль Греко
источник
1

Отправка 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). Когда пользователь переходит на страницу выхода из системы, код выполняется и удаляет учетные данные.

    //It should return 401, necessary for Safari only
    const logoutUrl = 'https://example.com/logout'; 
    const xmlHttp = new XMLHttpRequest();
    xmlHttp.open('POST', logoutUrl, true, 'logout');
    xmlHttp.send();

Также по какой-то причине Safari не сохраняет учетные данные во всплывающем окне «Базовая аутентификация HTTP», даже если выбран «запомнить пароль». Другие браузеры делают это правильно.

Fogus
источник
0
  • использовать идентификатор сеанса (cookie)
  • сделать недействительным идентификатор сеанса на сервере
  • Не принимать пользователей с неверными идентификаторами сеансов
Томалак
источник
Также полезно предложить базовую аутентификацию в качестве резервной схемы входа в систему, когда файлы cookie недоступны.
bobince
0

Я обновил решение mthoring для современных версий Chrome:

function logout(secUrl, redirUrl) {
    if (bowser.msie) {
        document.execCommand('ClearAuthenticationCache', 'false');
    } else if (bowser.gecko) {
        $.ajax({
            async: false,
            url: secUrl,
            type: 'GET',
            username: 'logout'
        });
    } else if (bowser.webkit || bowser.chrome) {
        var xmlhttp = new XMLHttpRequest();
        xmlhttp.open(\"GET\", secUrl, true);
        xmlhttp.setRequestHeader(\"Authorization\", \"Basic logout\");\
        xmlhttp.send();
    } else {
// http://stackoverflow.com/questions/5957822/how-to-clear-basic-authentication-details-in-chrome
        redirUrl = url.replace('http://', 'http://' + new Date().getTime() + '@');
    }
    setTimeout(function () {
        window.location.href = redirUrl;
    }, 200);
}
Максимум
источник
-1
    function logout(secUrl, redirUrl) {
        if (bowser.msie) {
            document.execCommand('ClearAuthenticationCache', 'false');
        } else if (bowser.gecko) {
            $.ajax({
                async: false,
                url: secUrl,
                type: 'GET',
                username: 'logout'
            });
        } else if (bowser.webkit) {
            var xmlhttp = new XMLHttpRequest();
            xmlhttp.open("GET", secUrl, true);
            xmlhttp.setRequestHeader("Authorization", "Basic logout");
            xmlhttp.send();
        } else {
            alert("Logging out automatically is unsupported for " + bowser.name
                + "\nYou must close the browser to log out.");
        }
        setTimeout(function () {
            window.location.href = redirUrl;
        }, 200);
    }

источник