http基本authentication“注销”
存储HTTP基本authentication凭证,直到浏览器closures,但有没有办法在浏览器closures之前删除凭证?
我阅读了关于HTTP 401状态码的技巧 ,但它似乎工作不正常 (见评论回答)。 也许机制trac使用的是解决scheme 。
凭证可以用JavaScript删除吗? 或者结合使用JavaScript和401状态技巧?
更新 :这个解决scheme在许多浏览器中似乎不再有效。 Kaitsu的评论:
在Chrome(16)和IE(9)中,发送错误凭证以使浏览器忘记正确的身份validation凭据的这种解决scheme不起作用。 适用于Firefox(9)。
其实你可以通过向服务发送错误的凭据来实现一个解决方法。 这在浏览器通过发送另一个(不存在的?)用户名没有密码。 浏览器丢失有关经过身份validation的凭据的信息。
例:
https://www.example.com/ =>使用基本身份validationlogin为“user1”
现在打开
HTTPS://foobar@www.example.com/
你已经注销。 ;)
问候
Ps:但是请依靠所有需要的浏览器testing这个依赖于给定的信息。
扩大1月的答案,并更新owyongsk的答案:
下面是一些示例jquery java脚本代码,使浏览器本质上发送一个假login请求到您试图保护的页面,在所有testing过的浏览器中导致caching的凭据被删除,然后redirect到一个非保护页。
警报()当出现错误时应该更改为其他内容。
//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()函数一样简单,它似乎可以无缝地工作给用户,尽pipe它在技术上仍然是一个黑客工作。
您可以尝试使用最新的Chrome和Firefox在当前工作的黑客。 在您的服务器上创build一个“/注销”页面,该页面只接受某个凭证,如username:false,password: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"); });
会发生什么情况是,错误的用户名和密码是从有效的XMLHttpRequestcaching而不是当前用户的凭据,当用户尝试login到任何页面时,它将使用caching的伪造凭证,未通过身份validation,它会要求用户进入另一个。 希望这可以帮助!
您可以使用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]-->
而对于其他用户,我的build议是这样的:
<div id="logout2" onclick="alert('Please close your browser window to logout')">[Logout]</div>
刚刚完成一个对我很好的实现:在服务器上我评估会话,用户名和密码,所以我跟踪这些信息,loginalgorithm如下:
1.检查用户和密码是否为空,否则返回401。
2.检查我们是否已经在我们的login用户列表中注册了会话,如果没有,那么检查用户和密码是否有效,如果是这样,保存会话ID在我们的列表中,然后返回401.我会解释这一步:如果会话ID是不同的三件事情之一发生:a)用户打开另一个窗口。 b)用户会话已经完成,即用户注销。 c)由于不活动,会话过期。 但是,只要用户凭证有效,我们就想保存会话,但是如果我们不保存会话,则返回401来询问密码,否则用户将无法login,因为我们没有新的会话ID在我们的名单。
3.检查用户凭证是否正确,如果是,则保存会话信息并继续提供页面,否则返回401。
所以,我必须注销用户的唯一方法就是在用户请求注销页面并且Web浏览器再次显示login对话框时closures服务器上的会话。
我在想我写这个,必须有一个步骤,程序检查用户是否已经login,以避免模仿,也许我可以保存多个会话ID每个用户允许多个会话,好吧,我想你对此的评论。
希望你明白了,如果你看到任何安全漏洞,请发表评论;)
如果您可以控制服务器代码,则可以创build一个“注销”function,无论提供的凭据如何,都会回复“401未授权”。 此失败迫使浏览器删除保存的凭据。
我只testing了Chrome 34,IE 11,Firefox 25 – 使用Express.js服务器和HTTP基本authentication。