代码之家  ›  专栏  ›  技术社区  ›  Dillie-O

有没有与IE的ClearAuthenticationCache相当的浏览器?

  •  23
  • Dillie-O  · 技术社区  · 17 年前

    我这里有一些内部的.net web应用程序,要求用户“注销”。我知道这在内联网应用程序上似乎没有什么意义,但它仍然存在。

    我们对Intranet应用程序使用Windows身份验证,因此我们使用基本身份验证连接到活动目录,并且凭据存储在浏览器缓存中,而不是使用.net窗体身份验证时的cookie。

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

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

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

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

    7 回复  |  直到 17 年前
        1
  •  11
  •   Community CDub    8 年前

    我想出了一个看起来相当一致但又老套的解决方案 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) 现在,浏览器已接受并缓存随机字符串凭据。当他们访问另一个页面时,它将尝试使用它们,失败,然后提示输入正确的页面。

        2
  •  6
  •   staromeste    13 年前

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

    加密对象似乎是 Web Crypto API ,根据 this document ,DOMCrypt API将添加更多函数。

    如上所述,微软IE(向上6个)有: document.execCommand("ClearAuthenticationCache", "false")

    我找不到清除Chrome中SLL缓存的方法(参见 this this 错误报告)。

    如果浏览器没有提供任何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";
    }
    
        3
  •  5
  •   AnthonyVO    13 年前

    几个音符。一些人说,您需要使用无效的凭据触发ajax请求,以使浏览器放弃自己的凭据。

    这是正确的,但是正如Keith指出的,服务器页面声明接受这些凭据对于这个方法的一致工作是非常重要的。

    有一个类似的提示:仅仅通过401错误打开登录对话框是不够的。如果用户取消对话框,则其缓存的凭据也不受影响。

    如果你能帮我戳一下MOZILLA https://bugzilla.mozilla.org/show_bug.cgi?id=287957 为FireFox添加正确的补丁。一个webkit错误登录到 https://bugs.webkit.org/show_bug.cgi?id=44823 . IE使用以下方法实现了一个性能较差的解决方案:

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

    不幸的是,我们需要使用这些长度来注销用户。

        4
  •  2
  •   Community CDub    8 年前

    为什么不使用FormsAuth,而是根据 this thread . 它和基本身份验证一样安全,但注销只是一个清空cookie(或者更确切地说,调用 FormsAuthentication.SignOut )

        5
  •  2
  •   Marius Marais    16 年前

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

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

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

        6
  •  0
  •   Andy    17 年前

    嗯,我一直在浏览BugZILA,现在看来,清除身份验证最好的方法是发送不存在的凭据。

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

        7
  •  -1
  •   Jason Bunting    17 年前

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

    高温高压