2

我正在开发一个 ASP.NET 应用程序,我们的用户使用客户端证书通过 HTTPS 进行身份验证。我们的用户只使用 IE7。

一旦客户端证书用于成功验证,它就会保留在浏览器的 SSL 缓存中,直到进程关闭或用户手动清除 SSL 缓存。我们希望能够在用户注销或会话到期时清除 SSL 缓存,以提高系统的安全性。

我们的客户已经使用智能卡来访问系统,当智能卡从客户端计算机中移除时,系统会自动卸载证书,但这根本不会清除浏览器缓存,从而为其他有权访问相同的用户留下了潜在的攻击途径机为正版用户。

我发现了如何从 JavaScript 中进行实际的缓存清除:

document.execCommand("ClearAuthenticationCache");

当用户显式注销时,这非常有效,因为我们可以在允许用户再次登录之前在客户端上执行脚本。

注意:IE7 仅允许在 Web 服务器上禁用 HTTP Keep-Alives 时以编程方式清除缓存。

这是棘手的一点 - 如果客户端的会话过期,在用户尝试再次登录之前,我不知道有什么方法可以在浏览器中处理这个问题。当他们到达登录页面时,我无法清除状态,因为我需要在页面在服务器上执行之前清除状态并选择新证书。

有任何想法吗?为问题的长度道歉,但背景对于这个问题很重要。

4

1 回答 1

2

没关系,我想出了一个很好的解决方案:

  • 当用户成功登录时,我们会创建一个额外的会话 cookie,该 cookie 在浏览器关闭之前不会过期。

  • 如果用户稍后返回登录页面并且请求未经身份验证,我们检查会话 cookie 的存在 - 如果存在,我们知道用户之前有过会话,因此我们显式将它们注销,就像我们为用户发起的注销做。如果会话 cookie 不存在,那么我们会尝试使用他们的证书自动登录用户。

  • 每次显式注销都会删除自定义会话 cookie,并在每次成功登录时重新填充。

这为我们提供了最佳的用户体验,并保证只有在会话仍然有效(15 分钟,滑动)时才会缓存证书。此外,用户无法删除会话 cookie,因此无法绕过此行为。他们也不能在不接受会话 cookie 的情况下使用该网站。

于 2009-03-18T23:24:53.823 回答