如何在c#中从智能卡读取凭据

时间:2012-08-03 07:15:41

标签: c# active-directory credentials smartcard

在我的组织中,用户必须使用SmartCard进行交互式登录Windows工作站(95,Vista和7)。几乎每天,我们都需要读取存储在SmartCard中的凭据,并将它们与ActiveDirectory进行比较,而无需实现自定义凭据管理器。我们比较的字段是:userPrincialName和sAMAccountName。

您能否向我展示一个代码,演示如何从智能卡读取凭据或引导我访问互联网上的文章/代码?

通过互联网进行搜索,建议使用凭证管理器或使用其他语言(如C,C ++)。 另外,我遇​​到了这篇文章:由orouit编写的http://www.codeproject.com/Articles/17013/Smart-Card-Framework-for-NET,这是一个使用智能卡的框架 - 但我认为这对我的简单任务来说太过分了。你觉得怎么样?

1 个答案:

答案 0 :(得分:5)

如果在Windows下开发,一旦插入智能卡窗口,将从智能卡获取所有证书,将它们放入我的证书存储区。

var smartCardCerts = new List<X509Certificate2>();
var myStore = new X509Store(StoreName.My, StoreLocation.CurrentUser);
foreach(X509Certificate2 cert in myStore)
{
  if( !cert.HasPrivateKey ) continue; // not smartcard for sure
  var rsa = cert.PrivateKey as RSACryptoServiceProvider;
  if( rsa==null ) continue; // not smart card cert again
  if( rsa.CspKeyContainerInfo.HardwareDevice ) // sure - smartcard
  {
     // inspect rsa.CspKeyContainerInfo.KeyContainerName Property
     // or rsa.CspKeyContainerInfo.ProviderName (your smartcard provider, such as 
     // "Schlumberger Cryptographic Service Provider" for Schlumberger Cryptoflex 4K
     // card, etc
     var name = cert.Name;
     rsa.SignData(); // to confirm presence of private key - to finally authenticate
  }
}

现在基本上可以通过.NET获得很多加密API。但您也可以直接使用API​​ Crypto API

例如,您可以通过

直接访问智能卡
CryptAcquireContext(&hProv,"\\.\<Reader Name>\<Container Name>",...)

其中读者姓名是读卡器名称,容器名称是上面代码段中的rsa.KeyContainerName。有多种方法可以访问这样的信息,而且Crypto API不是非常一致或直接。作为提示,CryptAcquireContext的.NET版本是带有CspParameters的RSACryptoServiceProvider,您可以根据需要指定容器名称。

在ActiveDirectory中找到用户可以通过System.DirectoryServices.DirectoyEntry和System.DirectoryServices.DirectorySearcher完成,但不要忘记System.DirectoryServices.ActiveDirectory.Forest和相关API,这使得一些事情变得更容易理解。 / p>

你可以得到