27

我在这里有一些内部 .net Web 应用程序,需要用户“注销”它们。我知道这在 Intranet 应用程序上似乎没有实际意义,但它仍然存在。

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

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

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

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

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

4

7 回答 7

13

我想出了一个看起来相当一致但很老套的修复程序,我仍然对此不满意

它确实有效:-)

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

2)在该页面上触发一个脚本来使用虚拟凭据加载另一个页面(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) 现在随机字符串凭据已被浏览器接受并缓存。当他们访问另一个页面时,它会尝试使用它们,失败,然后提示正确的页面。

于 2011-06-09T07:49:17.067 回答
7

一些笔记。一些人说您需要使用无效凭据触发 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 使用以下方法实现了一个糟糕但实用的解决方案:

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

不幸的是,我们需要花费这些时间来注销用户。

于 2011-12-13T23:39:25.023 回答
7

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

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

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

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

如果浏览器不提供任何 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";
}
于 2012-02-25T12:29:02.193 回答
3

I've been searching for a similar solution and came across a patch for Trac (an issue management system) that does this.

I've looked through the code (and I'm tired, so I'm not explaining everything); basically you need to do an AJAX call with guaranteed invalid credentials to your login page. The browser will get a 401 and know it needs to ask you for the right credentials next time you go there. You use AJAX instead of a redirect so that you can specify incorrect credentials and the browser doesn't popup a dialog.

On the patch (http://trac-hacks.org/wiki/TrueHttpLogoutPatch) page they use very rudimentary AJAX; something better like jQuery or Prototype, etc. is probably better, although this gets the job done.

于 2009-09-10T19:03:57.357 回答
2

为什么不使用 FormsAuth,而是根据此线程中的信息反对 ActiveDirectory 。它与 Basic Auth 一样(内)安全,但注销只是清空 cookie 的问题(或者更确切地说,调用FormsAuthentication.SignOut

于 2008-08-28T00:10:25.833 回答
0

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

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

于 2008-08-27T23:44:54.553 回答
-1

希望这将是有用的,直到有人真正提出明确的答案 -这个问题两年前在留言板上讨论过

高温高压

于 2008-08-27T23:41:07.353 回答