关于asp.net:是否有与IE的ClearAuthenticationCache等效的浏览器?

关于asp.net:是否有与IE的ClearAuthenticationCache等效的浏览器?

Is there a browser equivalent to IE's ClearAuthenticationCache?

我这里有一些内部的.net Web应用程序,要求用户"注销"它们。 我知道这在Intranet应用程序上似乎没有意义,但是尽管如此。

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

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

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

但是,对于要支持的其他浏览器(目前为Firefox,但我努力支持多浏览器),我只是向用户显示一条消息,他们需要关闭其浏览器以退出应用程序, 有效刷新应用程序缓存。

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


我提出了一个似乎相当一致但很棘手的修复程序,但我对此仍然不满意。

它确实可以工作:-)

1)将他们重定向到注销页面

2)在该页面上触发脚本以用虚假凭据(另存为jQuery中的样本)来ajax加载另一个页面:

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

3)总是应该在第一次返回401(以强制传递新的凭据),然后仅接受虚拟凭据(MVC中的示例):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[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)现在,随机字符串凭证已被浏览器接受并缓存。当他们访问另一个页面时,它将尝试使用它们,然后失败,然后提示输入正确的页面。


Mozilla实现了可通过DOM window对象使用的加密对象,该对象具有logout功能(Firefox 1.5及更高版本),可在浏览器级别清除SSL会话状态,以便"对任何令牌进行的下一个私有操作都将要求再次输入用户密码"(请参阅??此)。

加密对象似乎是Web加密API的实现,根据此文档,DOMCrypt API将添加更多功能。

如上所述,Microsoft IE(6或更高版本)具有:
document.execCommand("ClearAuthenticationCache","false")

我没有找到在Chrome中清除SLL缓存的方法(请参阅此错误报告)。

如果浏览器不提供任何API来执行此操作,我认为我们最好的方法是指示用户关闭浏览器。

这是我的工作:

1
2
3
4
5
6
7
8
9
10
11
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";
}

几个注意事项。一些人说过,您需要使用无效的凭据来触发ajax请求,以使浏览器删除其自己的凭据。

的确如此,但是正如Keith指出的那样,服务器页面必须接受这些凭据才能使此方法始终有效,这一点至关重要。

类似的注意:您的页面仅通过401错误显示登录对话框是不够的。如果用户从对话框中取消,则其缓存的凭据也不会受到影响。

另外,如果可以的话,请通过以下网址戳MOZILLA:https://bugzilla.mozilla.org/show_bug.cgi?id = 287957为FireFox添加适当的修复程序。在https://bugs.webkit.org/show_bug.cgi?id=44823上记录了一个Webkit错误。 IE使用以下方法实现了较差但实用的解决方案:

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

不幸的是,我们仅需注销登录即可使用这些长度。


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

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

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


为什么不使用FormsAuth,而是根据此线程中的信息,而是针对ActiveDirectory。与基本身份验证一样(不安全),但注销仅是清空cookie的问题(或者调用FormsAuthentication.SignOut)。


好吧,我已经在Bugzilla上浏览了一段时间,并且看来清除身份验证的最佳方法是发送不存在的凭据。

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


希望这将是有用的,直到有人真正给出明确的答案为止-两年前在留言板上讨论了此问题。

高温超导


推荐阅读