我们为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
}
Run Code Online (Sandbox Code Playgroud)
此文件位于IIS> SSL设置>"要求SSL"和"需要客户端证书"的目录中.
我不知道这是服务器配置问题还是编码问题,但是我已经开展了几个月的工作,并且无法找到答案为什么应用程序只有在托管一些CAC证书时才能获得CAC证书服务器.
问题#2
如果我在正确读取CAC的服务器上访问应用程序,它会从用于访问该计算机上的应用程序的所有CAC中提取所有证书的副本,而不是仅从读卡器中的CAC证书中获取证书.
AKO [https://akologin.us.army.mil/]至少过滤掉电子邮件证书; 但是,该站点不托管在Windows机器上.
结论
在我看来,除了Request.ClientCertificate集合和IIS中的两个复选框之外,还必须有一个更好,更深入的机制来访问和过滤来自智能卡读卡器的客户端证书.