Como desconectar o usuário do site usando a autenticação BASIC?

279

É possível desconectar o usuário de um site se ele estiver usando autenticação básica?

A sessão de assassinato não é suficiente, pois, uma vez que o usuário é autenticado, cada solicitação contém informações de login, para que o usuário seja automaticamente conectado na próxima vez em que acessar o site usando as mesmas credenciais.

Até agora, a única solução é fechar o navegador, mas isso não é aceitável do ponto de vista da usabilidade.

Marko
fonte
1
Apenas curioso. Por que você quer fazer isso?
DOK
17
Para poder efetuar login como um usuário diferente.
Marko
16
@DOK - É uma coisa comum de hackers sociais: os usuários devem conseguir sair enquanto deixam o navegador aberto. Suponha que um de seus usuários acesse o site em uma máquina pública? Eles precisam fazer logoff explicitamente para que o próximo usuário não possa acessar o site como eles.
Keith
@DOK Também existe o problema de impossibilitar o usuário de sair do site. O servidor pode limpar o cookie de autorização e até o cookie da sessão. Mas quando o navegador carregar a /página, eles serão automaticamente conectados novamente.
Ian Boyd
Eu estou usando o método que envia uma solicitação falsa para sair, mas bloqueia o usuário no cliente, pois há uma limitação de advertência de que o logon três vezes falhou no AD. Portanto, sugira usar esse método (envie uma solicitação falsa) com cuidado.
Qianchao Pan

Respostas:

170

A autenticação básica não foi projetada para gerenciar o logoff. Você pode fazer isso, mas não completamente automaticamente.

O que você precisa fazer é fazer com que o usuário clique em um link de logout e envie um '401 Não Autorizado' em resposta, usando o mesmo domínio e no mesmo nível de pasta de URL que o 401 normal que você envia solicitando um logon.

Eles devem ser direcionados para inserir credenciais erradas a seguir, por exemplo. um nome de usuário e senha em branco e, em resposta, você envia uma página "Você efetuou logout com êxito". As credenciais incorretas / em branco substituirão as credenciais corretas anteriores.

Em resumo, o script de logout inverte a lógica do script de logon, retornando apenas a página de sucesso se o usuário não estiver passando as credenciais corretas.

A questão é se a caixa de senha um tanto curiosa “não digite sua senha” atenderá à aceitação do usuário. Os gerenciadores de senhas que tentam preencher automaticamente a senha também podem atrapalhar aqui.

Edite para adicionar em resposta ao comentário: o novo login é um problema ligeiramente diferente (a menos que você precise de um logout / login em duas etapas, obviamente). Você deve rejeitar (401) a primeira tentativa de acessar o link de logon novamente, depois aceitar a segunda (que provavelmente possui um nome de usuário / senha diferente). Existem algumas maneiras de fazer isso. Um seria incluir o nome de usuário atual no link de logout (por exemplo, / relogin? Nome de usuário) e rejeitar quando as credenciais corresponderem ao nome de usuário.

bobince
fonte
2
Vou tentar essa abordagem. O objetivo do logout (neste caso) é permitir que o usuário efetue login como usuário diferente, portanto é uma solução perfeitamente aceitável. Quanto à senha de preenchimento automático, cabe ao usuário se ele a usará ou não. Obrigado
Marko
Ainda é o único caminho? Eu fiz um ASP.Net MVC e jQuery aplicação que funciona, mas eu ainda não estou feliz com ele: stackoverflow.com/questions/6277919
Keith
@ Keith: Ainda apenas esta e a resposta do systemPAUSE (que não funciona em todos os navegadores, mas é mais suave que a abordagem manual quando funciona).
bobince
16
O W3C é tão ativo na especificação HTML. Mas a especificação HTTP está definhando. O W3C deveria ter corrigido esse problema há cerca de duas décadas. Com o aumento do uso dos serviços REST, é necessário um método robusto de autenticação nativa do dia.
Dojo
9
Isso não parece funcionar corretamente no Chrome 46, navegando no host local. O Chrome parece manter a senha antiga (correta) e a nova senha especificada. Depois de navegar para a página de logout, o chrome usa corretamente a nova senha ATÉ ENCONTRAR UM 401 NÃO AUTORIZADO EM UMA PÁGINA NO SEU SITE. Após o primeiro 401, o Chrome volta à senha antiga (correta). Então, na verdade, não excluiu a senha em primeiro lugar.
precisa saber é o seguinte
196

Uma adição à resposta de bobince ...

Com o Ajax, você pode ter o link / botão 'Logout' conectado a uma função Javascript. Faça com que essa função envie o XMLHttpRequest com um nome de usuário e senha incorretos. Isso deve retornar a 401. Em seguida, defina document.location de volta à página de pré-login. Dessa forma, o usuário nunca verá a caixa de diálogo de logon extra durante o logout, nem precisará se lembrar de colocar más credenciais.

PAUSE do sistema
fonte
12
Bom truque, fazer com que o usuário insira manualmente credenciais ruins provavelmente não é aceitável para a maioria dos aplicativos da web.
Billman
1
Apenas verifique se o XMLHttpRequest não está definido como assíncrono ou você pode achar que o redirecionamento via ocorrerá antes que a solicitação de logout seja concluída.
Davidjb
5
Você também pode usar o mesmo truque para fazer login. Dessa forma, você pode personalizar a caixa de diálogo de login sem precisar alterar o método de autenticação do servidor. Este artigo dá algumas boas idéias: http://www.peej.co.uk/articles/http-auth-with-html-forms.html
Stijn de Witt
1
@davidjb Como as solicitações síncronas são consideradas obsoletas agora, uma solução alternativa pode ser redirecionar o usuário no retorno de chamada da solicitação assíncrona.
Hayden Schiff
1
David: chrome agora permite isso para XHRs, e posso confirmar que ele ainda está funcionando no chrome canary. bugs.chromium.org/p/chromium/issues/detail?id=435547
CpnCrunch
192

Peça ao usuário que clique em um link para https: // log: [email protected]/ . Isso substituirá as credenciais existentes por credenciais inválidas; desconectando-os.

Matthew Welborn
fonte
19
Por que este não recebe mais votos? Parece uma solução simples e funcional para mim. Existem problemas conhecidos com essa abordagem?
Amebe
35
Isso não funcionaria mais no Chrome, que por motivos de segurança ignora credenciais em um URL.
Thom
5
Isso funcionou para mim :) Eu estou usando Chrome versão 32.0.1700.102
abottoni
6
problema: usando a versão 39.0 do chrome. Quando clico no link de logout por esse método, o Chrome lembra as credenciais de logon incorretas e solicita novas credenciais de logon a cada carregamento da página, até eu ir para example.com sem credenciais de logon especificadas, para limpe a memória do chrome.
Scott Scott
4
Olá, não posso usá-lo para https no Chrome.
thienkhoi tran
67

Você pode fazer isso inteiramente em JavaScript:

O IE possui (por muito tempo) a API padrão para limpar o cache de autenticação básica:

document.execCommand("ClearAuthenticationCache")

Deve retornar true quando funciona. Retorna falso, indefinido ou explode em outros navegadores.

Novos navegadores (em dezembro de 2012: Chrome, FireFox, Safari) têm um comportamento "mágico". Se eles virem uma solicitação de autenticação básica bem - sucedida com qualquer outro nome de usuário falso (digamos logout), eles limparão o cache de credenciais e possivelmente o definirão para esse novo nome de usuário falso, que você precisa garantir que não seja um nome de usuário válido para exibir o conteúdo.

Exemplo básico disso é:

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

Uma maneira "assíncrona" de fazer o acima é fazer uma chamada AJAX utilizando o logoutnome de usuário. Exemplo:

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

Você também pode torná-lo um 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*/);

ddotsenko
fonte
1
Isso requer tratamento especial do servidor logoute / ou URL de logout do lado do servidor ?
ulidtko
1
@ulidtko Não, não deveria - toda a manipulação é do lado do cliente. A única situação que precisaria de tratamento especial é se um usuário chamado logoutexistir e possuir a senha gerada. Nesse caso quase impossivelmente raro, altere o ID do usuário para um que não exista no seu sistema.
Davidjb
2
Eu usei o bookmarklet acima hoje e funciona bem.
David Gleba
Eu usei isso e funcionou para Chrome e FF. Eu só precisei fazer um "GET" extra na minha página logout.php para limpar a $ _SESSION.
urbano
2
O bookmarklet também funciona no Edge. Simplesmente use com<a href='javascript:......need*/);'>Logout</a>
Eric
21

A função a seguir está confirmada para o Firefox 40, Chrome 44, Opera 31 e IE 11. O
Bowser é usado para detecção do navegador, o jQuery também é usado.

- secUrl é o URL de uma área protegida por senha da qual efetuar logout.
- redirUrl é o URL para uma área não protegida por senha (página de sucesso do logout).
- você pode querer aumentar o temporizador de redirecionamento (atualmente 200ms).

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
fonte
esta é a resposta mais abrangente
belidzs
Existe alguma razão para a $.ajaxvariante ser síncrona ( async: false) ea xmlhttpvariante sendo assíncrona (o trueno open())?
Bowi
1
O Chrome agora usa o mecanismo de renderização Blink, então você precisa mudar (bowser.gecko)para (bowser.gecko || bowser.blink).
Bowi
1
Por que o gecko / blink usa $.ajaxe o webkit usa new XMLHttpRequest? O gecko / blink não deveria poder fazer XMLHttpRequeste o webkit $.ajaxtambém? Estou confuso.
RemyNL
11

Aqui está um exemplo muito simples de Javascript usando jQuery:

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

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

Este usuário efetua logout sem mostrar a caixa de logon do navegador novamente e depois o redireciona para uma página desconectada

Romuald Brunet
fonte
1
window.location = window.location.href.replace (/: \ / \ //, ': // log: out @');
sebhaase 6/08/19
10

Isso não é diretamente possível com a autenticação básica.

Não há mecanismo na especificação HTTP para o servidor informar ao navegador para parar de enviar as credenciais que o usuário já apresentou.

Existem "hacks" (consulte outras respostas) normalmente envolvendo o uso de XMLHttpRequest para enviar uma solicitação HTTP com credenciais incorretas para substituir as fornecidas originalmente.

Alnitak
fonte
12
Em teoria. A prática prova o contrário, como pode ser visto nas outras respostas.
Stijn de Witt
2
E como você também pode ver nas outras respostas, não de maneira confiável, consistente e à prova de falhas!
precisa saber é o seguinte
5

Isso está funcionando para o 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
fonte
5

Na verdade, é bem simples.

Basta visitar o seguinte no seu navegador e usar credenciais incorretas: http: // nome do usuário: [email protected]

Isso deve "desconectar você".

Chiedo
fonte
1
Mas o usuário tem que ser um usuário REAL, caso contrário, recebi "401 não autorizado", mas usando o botão VOLTAR, posso continuar trabalhando como um usuário anteriormente logado. Testado no servidor Abyss X1 (2.11.1)
user2956477
1
Resposta duplicada (veja as de Matthew Welborn acima).
Skippy le Grand Gourou
3

Tudo o que você precisa é redirecionar o usuário em algum URL de logout e retornar 401 Unauthorized erro nele. Na página de erro (que deve ser acessível sem autenticação básica), você precisa fornecer um link completo para sua página inicial (incluindo esquema e nome do host). O usuário clicará neste link e o navegador solicitará credenciais novamente.

Exemplo para 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;
}

Página de erro /home/user/errors/401.html:

<!DOCTYPE html>
<p>You're not authorised. <a href="<!--# echo var="scheme" -->://<!--# echo var="host" -->/">Login</a>.</p>
Envek
fonte
Gostaria ainda sugerir o uso http_hostem 401.htmlvez de, simplesmente host, como o primeiro também adiciona o número da porta (no caso de uma porta não-padrão está a ser usado)
Emil 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;
}
Charlie
fonte
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;
}
Sushovan Mukherjee
fonte
2

Com base no que li acima, recebi uma solução simples que funciona em qualquer navegador:

1) na página de logout, você chama um ajax para o back-end de login. Seu back-end de login deve aceitar usuário de logout. Depois que o back-end aceita, o navegador limpa o usuário atual e assume o usuário "logout".

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

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

2) Agora, quando o usuário voltar ao arquivo de índice normal, ele tentará entrar automaticamente no sistema com o usuário "logout". Nesta segunda vez, você deve bloqueá-lo, respondendo com 401 para chamar a caixa de diálogo de login / senha.

3) Existem várias maneiras de fazer isso: criei dois back-ends de login, um que aceita o usuário de logout e outro que não. Minha página de login normal usa a que não aceita, minha página de logout usa a que aceita.

Foad
fonte
2

Acabei de testar o seguinte no Chrome (79), Firefox (71) e Edge (44) e funciona bem. Aplica a solução de script como outros observados acima.

Basta adicionar um link "Logout" e, quando clicar, retornar o seguinte 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>
Teo Bebekis
fonte
1

Este JavaScript deve estar funcionando para todos os navegadores da versão mais recente:

//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+'/';
}
Amit Shah
fonte
1

adicione isso ao seu aplicativo:

@app.route('/logout')
def logout():
    return ('Logout', 401, {'WWW-Authenticate': 'Basic realm="Login required"'})
Amir Mofakhar
fonte
melhor usar este retorno: retorno ( 'Sair', 401)
Amir Mofakhar
1

digite chrome://restartna barra de endereço e o chrome, com todos os aplicativos em execução em segundo plano, será reiniciado e o cache de senha de autenticação será limpo.

Todos
fonte
1

Apenas para o registro, existe um novo cabeçalho de resposta HTTP chamado Clear-Site-Data. Se a resposta do servidor incluir um Clear-Site-Data: "cookies"cabeçalho, as credenciais de autenticação (não apenas os cookies) deverão ser removidas. Eu testei no Chrome 77, mas este aviso aparece no console:

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.

E as credenciais de autenticação não são removidas, portanto isso não funciona (por enquanto) para implementar logins de autenticação básicos, mas talvez no futuro o faça. Não testou em outros navegadores.

Referências:

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

Nahuel Greco
fonte
1

O envio https://invalid_login@hostnamefunciona bem em qualquer lugar, exceto no Safari no Mac (bem, o Edge não foi verificado, mas deve funcionar lá também).

O logout não funciona no Safari quando um usuário seleciona 'lembrar senha' no pop-up Autenticação básica HTTP. Nesse caso, a senha é armazenada em Acesso ao chaveiro (Finder> Aplicativos> Utilitários> Acesso ao chaveiro (ou CMD + SPACE e digite "Acesso ao chaveiro")). Enviandohttps://invalid_login@hostname não afeta o acesso ao chaveiro; portanto, com esta caixa de seleção, não é possível fazer logout no Safari no Mac. Pelo menos é assim que funciona para mim.

MacOS Mojave (10.14.6), Safari 12.1.2.

O código abaixo funciona bem para mim no Firefox (73), Chrome (80) e Safari (12). Quando um usuário navega para uma página de logout, o código é executado e descarta as credenciais.

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

Por algum motivo, o Safari não salva credenciais no pop-up Autenticação básica HTTP, mesmo quando a opção 'lembrar senha' está selecionada. Os outros navegadores fazem isso corretamente.

Fogus
fonte
0
  • use um ID de sessão (cookie)
  • invalidar o ID da sessão no servidor
  • Não aceite usuários com IDs de sessão inválidos
Tomalak
fonte
Também é bom oferecer autenticação básica como um esquema de login de backup para quando os cookies não estiverem disponíveis.
bobince
0

Atualizei a solução do mthoring para versões modernas do 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);
}
Máx.
fonte
-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);
    }

fonte