因此Windows改变了它在Windows 10中处理智能卡的方式。我有一个应用程序可以记住用户登录到Web应用程序的最后一个选定证书。如果插入了智能卡,我们会给用户
X509Certificate2UI.SelectFromCollection
通过使用私钥的CspKeyContainerInfo.Accessible值扫描个人商店的证书来构建一个集合。
虽然从技术上讲,一切仍然有效,但只要Windows 10尝试查看私钥是否可用,它就会提示用户“插入正确的智能卡”。
因此,每当用户获得新的智能卡或在本地登录时,他们必须经过一些丑陋的提示并单击取消,直到他们获得正确的证书选择器。
目前,检查硬件令牌是否可用的代码如下所示:
public static bool IsCertificateAvailable(X509Certificate2 cert)
{
try
{
AsymmetricAlgorithm akeyInfo = cert.PrivateKey;
ICspAsymmetricAlgorithm keyInfo = akeyInfo as ICspAsymmetricAlgorithm;
if (keyInfo.CspKeyContainerInfo.Accessible)
{
Logger.Log(LogLevel.Info, "Certificate {0} has a private key", cert.GetSerialNumberString());
return true;
}
else //has no private key
{
Logger.Log(LogLevel.Info, "Certificate {0} has no private key", cert.GetSerialNumberString());
return false;
}
}
catch (CryptographicException)
{
return false;
}
}
有没有办法在用户不必点击取消的情况下完成相同的任务?