我正在开发一个 ASP.NET 应用程序,我们的用户在该应用程序中使用客户端证书通过 HTTPS 进行身份验证。我们的用户只使用 IE7。
一旦使用客户端证书成功进行身份验证,它就会保留在浏览器的 SSL 缓存中,直到进程关闭或用户手动清除 SSL 缓存。我们希望能够在用户注销或 session 过期时清除 SSL 缓存,以提高系统的安全性。
我们的客户已经使用智能卡访问系统,当智能卡从客户端计算机中移除时,系统会自动卸载证书,但这根本不会清除浏览器缓存,留下了来自另一个有权访问的用户的潜在攻击途径与真正的用户在同一台机器上。
我发现了如何从 JavaScript 中进行实际的缓存清除:
document.execCommand("ClearAuthenticationCache");
当用户明确注销时,它会完美运行,因为我们可以在允许用户再次登录之前在客户端上执行脚本。
注意:IE7 仅允许在 Web 服务器上禁用 HTTP Keep-Alives 时以编程方式清除缓存。
这是棘手的一点 - 如果客户端的 session 过期,我不知道在用户尝试再次登录之前在浏览器中处理这个问题的任何方法。当他们到达登录页面时,我无法清除状态,因为我需要在页面在服务器上执行之前清除状态并选择新证书。
有什么想法吗?抱歉问题太长,但背景对于这个问题很重要。
最佳答案
没关系,我想出了一个很好的解决方案:
当用户成功登录时,我们会创建一个额外的 session cookie,该 cookie 在浏览器关闭之前不会过期。
如果用户稍后返回登录页面并且请求未经身份验证,我们会检查 session cookie 是否存在 - 如果存在,我们就知道用户之前有过 session ,因此我们明确将它们注销,就像我们对用户启动的注销所做的那样。如果 session cookie 不存在,那么我们会尝试让用户使用他们的证书自动登录。
每次显式注销都会删除自定义 session cookie,并会在每次成功登录时重新填充。
这为我们提供了最佳的用户体验,并保证只要 session 仍然有效(15 分钟,滑动),证书就会被缓存。此外,用户无法删除 session cookie,因此无法绕过此行为。如果不接受 session cookie,他们也无法使用该网站。
关于asp.net - 如何在用户 session 过期时清除浏览器中的 SSL 状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/653097/