http基本身份验证"注销"

dea*_*mon 60 javascript http basic-authentication logout

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

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

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

Jan*_*an. 33

更新:此解决方案在许多浏览器中似乎不再起作用.Kaitsu的评论:

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


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

例:

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

现在打开

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

你被登出了.;)

问候

Ps:但是在依赖给定的信息之前,请用所有需要的浏览器测试一下.

  • 这种发送虚假凭证以使浏览器忘记正确的经过身份验证的凭据的解决方案在Chrome(16)和IE(9)中不起作用.适用于Firefox(9).所以,不是一个非常有用的解决方案 (4认同)
  • ajreal:我再说一遍:一旦你向服务器发送一个新的(尚未经过身份验证的用户名"foobar"),就像在我的例子中那样,浏览器会清除有效信息("user1")的身份验证信息.无论您在此之后访问哪个页面,系统都会提示您再次进行身份验证!就试一试吧!有用!确保您没有在测试服务器上保存凭据. (3认同)
  • 问题和答案来自2010年.时间变化版本和版本可能会改变某些行为.我明确表示要在依赖答案之前测试结果. (2认同)

1n5*_*1aC 10

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

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

当出现问题时,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 = "/";
    });
}
Run Code Online (Sandbox Code Playgroud)

然后就像注销链接调用logout()函数一样简单,它似乎无缝地工作到用户,虽然它在技术上仍然是一个黑客工作.

  • 这在2016年适用于Chrome!到目前为止我遇到的最好的解决方案.. (2认同)

owy*_*gsk 7

您可以尝试使用最新的Chrome和Firefox进行黑客攻击.在服务器上创建一个"/ logout"页面,该页面只接受某个凭证,例如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");                                              
  });
Run Code Online (Sandbox Code Playgroud)

错误的用户名和密码是从有效的XMLHttpRequest而不是当前用户的凭据缓存的,当用户尝试登录任何页面时,它将使用缓存的伪凭证,无法进行身份验证,它会询问用户进入另一个.希望这可以帮助!