【问题标题】:Is there a browser equivalent to IE's ClearAuthenticationCache?是否有相当于 IE 的 ClearAuthenticationCache 的浏览器?
【发布时间】:2010-09-07 01:49:30
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: asp.net authentication cross-browser


    【解决方案1】:

    希望这将是有用的,直到有人真正提出明确的答案 - this issue was discussed two years ago on a message board

    HTH

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • 我可以调查 FormsAuth 的事情,但现在的策略是对系统使用 Windows 身份验证。我将检查所有这三个选项。如果其他人想到了什么,请务必发布。
        【解决方案4】:

        我一直在寻找类似的解决方案,并发现了一个用于执行此操作的 Trac(问题管理系统)的补丁。

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

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

        【讨论】:

        • 这 100% 有效,不会影响您的浏览器历史记录
        【解决方案5】:

        我想出了一个看起来相当一致但很老套的修复方法,I'm still not happy with it

        它确实有效:-)

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

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

        【讨论】:

        • 嗯,这是一种相当有趣的处理方式。如果我已经有 WinForms 应用程序,你可以不使用 MVC 吗?
        • @Dillie-O 是的,只需创建一个新的.aspx.ashx 页面,将其粘贴在页面加载中,将string id = Request["id"]; 添加到顶部并将两个return Content(... 替换为@ 987654329@。或者,您可以创建自定义 HttpHandler。它所需要做的就是为有效的用户名和密码返回一个 HTTP 401,然后为虚拟的返回一个 HTTP 200(这会欺骗浏览器来缓存它)。
        • 这很可靠,但在 FF 和 WebKit 上,它会弹出一个登录对话框,可能会使用户感到困惑。我希望使用 AJAX 可以防止这种情况发生。仍在研究中。
        • @AnthonyVO - 我最初是在 Chrome(基于 webkit)上写的,它没有重新提示,我不知道为什么这对你来说不同。我只包含了我的代码的一个子集,所以我可能在我的答案中遗漏了一些东西。您使用的是什么技术栈?
        • IIS 7.5 以及所有浏览器。不是 MVC WebApp。关于您对@Dillie-O 关于使用 HttpHandler 的评论,这是行不通的,因为 HttpHandler 不会看到身份验证流量。请参阅:stackoverflow.com/questions/769432/ihttphandler-vs-ihttpmodule。打算尝试一个 iHttpModule..
        【解决方案6】:

        一些笔记。一些人说您需要使用无效凭据触发 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");
        

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

        【讨论】:

          【解决方案7】:

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

          crypto 对象似乎是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";
          }
          

          【讨论】:

          • 您应该检查是否支持该命令,而不是检查 userAgent 字符串:if document.queryCommandSupported("ClearAuthenticationCache") { ... }
          猜你喜欢
          • 1970-01-01
          • 2013-02-09
          • 2013-10-08
          • 2016-01-31
          • 2021-02-17
          • 1970-01-01
          • 2010-11-09
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多