http基本身份验证“注销”

IT技术 javascript http logout basic-authentication
2021-03-07 11:09:16

HTTP 基本身份验证凭据会一直存储到浏览器关闭为止,但是有没有办法在浏览器关闭之前删除凭据?

我读到了一个关于 HTTP 401 状态代码技巧,但它似乎工作不正常(见评论回答)。也许trac使用机制是解决方案

可以使用 JavaScript 删除凭据吗?或者结合 JavaScript 和状态 401 技巧?

6个回答

更新:此解决方案在许多浏览器中似乎不再适用。凯子的评论:

这种发送虚假凭据以使浏览器忘记正确的经过身份验证的凭据的解决方案在 Chrome (16) 和 IE (9) 中不起作用。适用于 Firefox (9)。


实际上,您可以通过向服务发送虚假凭据来实施解决方法。这在浏览器中通过发送另一个(不存在?)没有密码的用户名来工作。浏览器会丢失有关经过身份验证的凭据的信息。

例子:

https://www.example.com/ => 使用基本身份验证作为“user1”登录

现在开放

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

您已注销。;)

问候

Ps:但是在依赖给定的信息之前,请使用所有需要的浏览器进行测试。

导航到foob​​ar@www.example.com被视为可能的网络钓鱼尝试。出于安全原因,IE 和其他浏览器可能会忽略该请求。
2021-04-20 11:09:16
@ajreal:当您点击“返回”时,您会看到页面的缓存版本。尝试重新加载..(至少在 FF 和 chrome 中!我想在其他浏览器中也是如此)
2021-04-23 11:09:16
ajreal:我再说一遍:一旦您像我的示例中那样向服务器发送一个新的(尚未经过身份验证的用户名“foobar”),浏览器就会清除有效信息(“user1”)的身份验证信息。无论您之后访问哪个页面 - 系统都会提示您再次进行身份验证!去尝试一下!有用!确保您没有在测试服务器上保存凭据。
2021-04-25 11:09:16
问题和答案来自 2010 年。时间变化 版本和版本可能会改变某些行为。我明确表示在依赖答案之前要测试结果。
2021-05-08 11:09:16
这种发送虚假凭据以使浏览器忘记正确的经过身份验证的凭据的解决方案在 Chrome (16) 和 IE (9) 中不起作用。适用于 Firefox (9)。所以,不是一个非常有用的解决方案。
2021-05-11 11:09:16

扩展 Jan. 的答案,并更新 owyongsk 的答案:

这是一些示例 jquery java 脚本代码,它使浏览器本质上向您尝试保护的页面发送虚假登录请求,这在所有经过测试的浏览器中都会导致缓存的凭据被删除,然后将用户重定向到不受保护的页面页。

出现问题时的 alert() 可能应该更改为其他内容。

//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() 函数一样简单,它似乎对用户来说是无缝的,尽管从技术上讲它仍然是一个黑客工作。

极好的!非常感谢。
2021-05-05 11:09:16
使用 Chrome 54、Firefox 50、IExplorer 11、Edge 38.14393 进行测试,效果很好(2016 年 12 月)。
2021-05-11 11:09:16

您可以尝试使用最新的 Chrome 和 Firefox 进行当前有效的 hack。在您的服务器上创建一个“/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 缓存而不是当前用户的凭据,当用户尝试登录任何页面时,它将使用缓存的虚假凭据,如果无法通过身份验证,它会询问用户进入另一个。希望这可以帮助!

可能与我当时使用的 Chrome 或 Firefox 版本不同。我不再维护此代码,所以我无能为力
2021-04-20 11:09:16
这在最新的 Chrome 中就像一个魅力。我有一个基于 python 的flask服务器。当他们进入注销页面时,我只在信用为“假”、“假”时才检查并返回成功。这样浏览器就会缓存它。
2021-05-06 11:09:16
@Pies 试试下面这个答案中的代码我还没有测试过,但它说这是这个答案的更新。重定向仅在 AJAX 请求完成后发生,这应该会有所帮助。
2021-05-08 11:09:16

刚刚完成一个对我来说很好的实现:在服务器上我评估会话、用户名和密码,所以我跟踪这些信息,登录算法如下:

1.检查用户名和密码是否不为空,否则返回401。

2.检查我们是否已经在我们的登录用户列表中注册了会话,如果没有则检查用户和密码是否有效,如果是,则在我们的列表中保存会话ID,然后返回401。我将解释这一步:如果session id 是不同的三件事之一:a) 用户正在打开另一个窗口。b) 用户会话已完成,即用户已注销。c) 会话因不活动而过期。但是只要用户凭据有效,我们就想保存会话,但返回 401 要求输入一次密码,如果我们不保存会话,则用户永远无法登录,因为我们没有新的会话 ID在我们的名单中。

3.检查用户凭据是否正确,如果正确,保存会话信息并继续提供页面,否则返回401。

因此,当用户请求注销页面并且 Web 浏览器再次显示登录对话框时,我唯一需要注销用户的事情就是关闭服务器上的会话。

我在写这篇文章时在想,必须有一个步骤让程序检查用户是否已经登录以避免模拟,也许我可以为每个用户保存一个以上的会话 ID 以允许多个会话,好吧,我想你对它的评论。

希望你能明白,如果你看到任何安全漏洞,请发表评论;)

如果浏览器在初次尝试时没有存储他们的凭据,这似乎需要用户登录两次 - 对吗?
2021-04-17 11:09:16

您可以使用 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>
在 IE9 中工作,谢谢!您是否碰巧知道 Firefox、Chrome 或其他浏览器中的类似解决方案?
2021-05-03 11:09:16