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

6
在我们的组织中,用户必须使用智能卡作为交互式登录Windows工作站(95、Vista和7)的凭证。几乎每天,我们需要从智能卡读取存储的凭证,并将其与ActiveDirectory进行比较,而不实现自定义凭证管理器。我们比较的字段是:userPrincialName和sAMAccountName。
请问您能否展示一个演示如何从智能卡读取凭证的代码,或指导我在互联网上查找文章/代码?
在互联网上搜索建议实现凭证管理器或使用其他语言(如C、C ++)。此外,我发现了这篇文章:http://www.codeproject.com/Articles/17013/Smart-Card-Framework-for-NET,由orouit编写,它是用于处理智能卡的框架 - 但我认为这对于我的简单任务来说太过复杂了。您怎么看?

我建议您向智能卡读卡器制造商咨询,您需要了解其驱动程序的API如何工作。 - Alex
使用智能卡可能看起来很简单,但外表可能会欺骗人。像Alex所说的那样,您可能需要使用智能卡读卡器的API,但最有可能的是标准的Windows API应该可以达到目的。您找到的文章是必读的,并且这种方法很遗憾不是过度的。 - dandan78
Alex - 很遗憾,读者生产商的网站(本地生产商)上没有文档或API。谢谢dandan78,如果这篇文章是必读的,那么我会阅读它。祝你有美好的一天。 - Hamed Salameh
我同意,这绝不是一项简单的任务。Windows API 不断变化,创建或附加到登录过程可能需要数月时间。如果您不知道如何做到这一点,最好从已经实现它的卡供应商购买。 - Maarten Bodewes
2
Windows 95,你一定是在开玩笑,对吧?对吧?拜托了? - Maarten Bodewes
1个回答

9

如果在Windows下开发,一旦插入智能卡,Windows会将所有证书从智能卡中提取并放置在“我的证书”存储库中。

var smartCardCerts = new List<X509Certificate2>();
var myStore = new X509Store(StoreName.My, StoreLocation.CurrentUser);
myStore.Open(OpenFlags.ReadOnly);
foreach(X509Certificate2 cert in myStore.Certificates)
{
  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。但是您也可以直接使用APICrypto 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,这可以使某些事情更容易弄清楚。

您将能够获得


3
为了使它能够工作,我不得不对其进行两个调整。在获取任何证书之前,您必须使用 myStore.Open(OpenFlags.ReadOnly) 打开证书存储。其次,您不能遍历 myStore,而是需要遍历 myStore.Certificates - mpursuit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接