是否存在等同于IE的ClearAuthenticationCache的浏览器?

时间:2008-08-27 23:34:19

标签: asp.net authentication cross-browser

我在这里有一些内部.net网络应用程序,要求用户“注销”它们。我知道这在Intranet应用程序上似乎没什么问题,但它仍然存在。

我们对Intranet应用程序使用Windows身份验证,因此我们使用基本身份验证绑定到Active Directory,并且凭据存储在浏览器缓存中,而不是使用.net表单身份验证时的cookie。

在IE6 +中,您可以通过执行以下操作来利用他们创建的特殊JavaScript函数:

document.execCommand("ClearAuthenticationCache", "false")

但是,对于其他需要支持的浏览器(即目前的Firefox,但我力求支持多浏览器),我只是向用户显示消息,他们需要关闭浏览器才能注销应用程序,它可以有效地刷新应用程序缓存。

有人知道某些命令/黑客/等等。我可以在其他浏览器中使用它来刷新身份验证缓存吗?

7 个答案:

答案 0 :(得分:11)

我想出了一个似乎相当一致的修复方法,但是很谦虚I'm still not happy with it

它确实有效: - )

1)将它们重定向到Logoff页面

2)在该页面上激活一个脚本到ajax加载另一个带有伪凭证的页面(jQuery中的示例):

$j.ajax({
    url: '<%:Url.Action("LogOff401", new { id = random })%>',
    type: 'POST',
    username: '<%:random%>',
    password: '<%:random%>',
    success: function () { alert('logged off'); }
});

3)应该总是第一次返回401(强制传递新凭据),然后只接受伪凭证(MVC中的示例):

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult LogOff401(string id)
{
    // if we've been passed HTTP authorisation
    string httpAuth = this.Request.Headers["Authorization"];
    if (!string.IsNullOrEmpty(httpAuth) &&
        httpAuth.StartsWith("basic", StringComparison.OrdinalIgnoreCase))
    {
        // build the string we expect - don't allow regular users to pass
        byte[] enc = Encoding.UTF8.GetBytes(id + ':' + id);
        string expected = "basic " + Convert.ToBase64String(enc);

        if (string.Equals(httpAuth, expected, StringComparison.OrdinalIgnoreCase))
        {
            return Content("You are logged out.");
        }
    }

    // return a request for an HTTP basic auth token, this will cause XmlHttp to pass the new header
    this.Response.StatusCode = 401; 
    this.Response.StatusDescription = "Unauthorized";
    this.Response.AppendHeader("WWW-Authenticate", "basic realm=\"My Realm\""); 

    return Content("Force AJAX component to sent header");
}

4)现在,浏览器已接受并缓存随机字符串凭据。当他们访问另一个页面时,它会尝试使用它们,失败,然后提示输入正确的页面。

答案 1 :(得分:6)

Mozilla实现了加密对象,可通过DOM window对象获得,该对象具有logout功能(Firefox 1.5向上)以清除浏览器级别的SSL会话状态,以便“下一个私有”对任何令牌的操作将再次需要用户密码“(参见this)。

加密对象似乎是Web Crypto API的一个实现,根据this document,DOMCrypt API将添加更多功能。

如上所述,Microsoft IE(6向上)具有: document.execCommand("ClearAuthenticationCache", "false")

我发现无法清除Chrome中的SLL缓存(请参阅thisthis错误报告)。

如果浏览器没有提供任何API来执行此操作,我认为我们可以做的更好的事情是指示用户关闭浏览器。

这就是我的所作所为:

var agt=navigator.userAgent.toLowerCase();
if (agt.indexOf("msie") !== -1) {
    document.execCommand("ClearAuthenticationCache","false");
}
//window.crypto is defined in Chrome, but it has no logout function
else if (window.crypto && typeof window.crypto.logout === "function"){
    window.crypto.logout();
}
else{
    window.location = "/page/to/instruct/the/user/to/close/the/browser";
}

答案 2 :(得分:5)

一些笔记。有些人说你需要使用无效的凭证来启动ajax请求,以使浏览器删除它自己的凭据。

这是事实,但正如Keith指出的那样,服务器页面声称接受这些凭据以使此方法始终如一地工作至关重要。

在类似的说明中:您的页面仅通过401错误调出登录对话框是不够的。如果用户取消对话框,则其缓存的凭据也不受影响。

另外,如果你能在https://bugzilla.mozilla.org/show_bug.cgi?id=287957点击MOZILLA,为FireFox添加一个正确的修复程序。在https://bugs.webkit.org/show_bug.cgi?id=44823记录了一个webkit错误。 IE使用以下方法实现了一个糟糕但功能强大的解决方案:

document.execCommand("ClearAuthenticationCache", "false");

遗憾的是,我们需要这些长度才能注销用户。

答案 3 :(得分:2)

为什么不使用FormsAuth,而是根据this thread中的信息使用ActiveDirectory。它和Basic Auth一样安全,但是注销只是消隐一个cookie(或者更确切地说,调用FormsAuthentication.SignOut

答案 4 :(得分:2)

我一直在寻找类似的解决方案,并且遇到了Trac(一个问题管理系统)的补丁。

我查看了代码(我很累,所以我不解释所有内容);基本上你需要通过保证无效凭据到您的登录页面进行AJAX通话。浏览器将获得401并且知道它需要在您下次去时询问您正确的凭据。您使用AJAX而不是重定向,以便您可以指定不正确的凭据,并且浏览器不会弹出对话框。

在补丁(http://trac-hacks.org/wiki/TrueHttpLogoutPatch)页面上,他们使用非常基本的AJAX;像jQuery或Prototype等更好的东西可能更好,虽然这可以完成工作。

答案 5 :(得分:0)

好吧,我现在一直在浏览Bugzilla,看似清除身份验证的最佳方式就是发送不存在的凭据。

在此处阅读更多内容:https://bugzilla.mozilla.org/show_bug.cgi?id=287957

答案 6 :(得分:-1)

希望这会有用,直到某人真正得到明确答案 - this issue was discussed two years ago on a message board

HTH