HTTP 基本身份验证凭据会一直存储到浏览器关闭为止,但是有没有办法在浏览器关闭之前删除凭据?
我读到了一个关于 HTTP 401 状态代码的技巧,但它似乎工作不正常(见评论回答)。也许trac使用的机制是解决方案。
可以使用 JavaScript 删除凭据吗?或者结合 JavaScript 和状态 401 技巧?
HTTP 基本身份验证凭据会一直存储到浏览器关闭为止,但是有没有办法在浏览器关闭之前删除凭据?
我读到了一个关于 HTTP 401 状态代码的技巧,但它似乎工作不正常(见评论回答)。也许trac使用的机制是解决方案。
可以使用 JavaScript 删除凭据吗?或者结合 JavaScript 和状态 401 技巧?
更新:此解决方案在许多浏览器中似乎不再适用。凯子的评论:
这种发送虚假凭据以使浏览器忘记正确的经过身份验证的凭据的解决方案在 Chrome (16) 和 IE (9) 中不起作用。适用于 Firefox (9)。
实际上,您可以通过向服务发送虚假凭据来实施解决方法。这在浏览器中通过发送另一个(不存在?)没有密码的用户名来工作。浏览器会丢失有关经过身份验证的凭据的信息。
例子:
https://www.example.com/ => 使用基本身份验证作为“user1”登录
现在开放
https://foobar@www.example.com/
您已注销。;)
问候
Ps:但是在依赖给定的信息之前,请使用所有需要的浏览器进行测试。
扩展 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() 函数一样简单,它似乎对用户来说是无缝的,尽管从技术上讲它仍然是一个黑客工作。
您可以尝试使用最新的 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 缓存而不是当前用户的凭据,当用户尝试登录任何页面时,它将使用缓存的虚假凭据,如果无法通过身份验证,它会询问用户进入另一个。希望这可以帮助!
刚刚完成一个对我来说很好的实现:在服务器上我评估会话、用户名和密码,所以我跟踪这些信息,登录算法如下:
1.检查用户名和密码是否不为空,否则返回401。
2.检查我们是否已经在我们的登录用户列表中注册了会话,如果没有则检查用户和密码是否有效,如果是,则在我们的列表中保存会话ID,然后返回401。我将解释这一步:如果session id 是不同的三件事之一:a) 用户正在打开另一个窗口。b) 用户会话已完成,即用户已注销。c) 会话因不活动而过期。但是只要用户凭据有效,我们就想保存会话,但返回 401 要求输入一次密码,如果我们不保存会话,则用户永远无法登录,因为我们没有新的会话 ID在我们的名单中。
3.检查用户凭据是否正确,如果正确,保存会话信息并继续提供页面,否则返回401。
因此,当用户请求注销页面并且 Web 浏览器再次显示登录对话框时,我唯一需要注销用户的事情就是关闭服务器上的会话。
我在写这篇文章时在想,必须有一个步骤让程序检查用户是否已经登录以避免模拟,也许我可以为每个用户保存一个以上的会话 ID 以允许多个会话,好吧,我想你对它的评论。
希望你能明白,如果你看到任何安全漏洞,请发表评论;)
您可以使用 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>