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