我们为 DoD 开发了一个 .NET C# Web 应用程序,它使用 CAC(通用访问卡)作为唯一的身份验证方法。我们在服务器上有一个受信任的 SSL,该应用程序在多个位置运行,并且一切都按预期运行 - 在大多数情况下。
问题 #1
主要问题是,在我们的一些内部开发服务器上,当您在读卡器中使用有效的 CAC 点击“登录”时,只会显示一个证书,而不是来自 CAC。它用于通过网络对我的工作笔记本电脑进行身份验证(“客户端身份验证”和“智能卡登录”属性在“证书”管理单元中进行检查)。
我们在另一个网络上有另一台服务器,客户端证书身份验证运行良好 - 它显示来自 CAC 的证书,但不显示上述证书。我尝试在这两个服务器上并排比较我在 Windows Server 2008 R2 中能想到的所有内容,看看我是否能找到可能不同的东西,但它们似乎都是 Windows Server 2008 的默认安装R2。
以下代码用于读取客户端证书:
if (Request.ClientCertificate.IsPresent)
{
HttpClientCertificate Cert = HttpContext.Current.Request.ClientCertificate;
//use cert info to check db and create session
}
此文件位于选中 IIS > SSL 设置 >“需要 SSL”和“需要客户端证书”的目录中。
我不知道这是服务器配置问题还是编码问题,但我已经为此工作了几个月,无法找到为什么应用程序只有在托管在某些服务器上时才能获得 CAC 证书的答案服务器。
问题 #2
如果我在正确读取 CAC 的服务器上访问应用程序,它会从用于访问该计算机上的应用程序的所有 CAC 中提取所有证书的副本,而不仅仅是来自读卡器中物理上的 CAC 的证书.
AKO [https://aklogin.us.army.mil/] 至少过滤掉电子邮件证书;但是,该站点并非托管在 Windows 机器上。
结论
在我看来,除了 Request.ClientCertificate 集合和 IIS 中的两个复选框之外,还必须有一种更好、更深入的机制来访问和过滤来自智能卡读卡器的客户端证书。