4

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

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

通过 Internet 搜索建议实施凭证管理器或使用其他语言(如 C、C++)。另外,我看到了这篇文章:http://www.codeproject.com/Articles/17013/Smart-Card-Framework-for-NET由 orouit 编写,它是一个使用 SmartCards 的框架 - 但我认为这太过分了对于我的简单任务。你怎么看?

4

1 回答 1

8

好吧,如果在 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
  }
}

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

例如,您可以通过直接访问智能卡

CryptAcquireContext(&hProv,"\\.\<Reader Name>\<Container Name>",...)

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

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

你将能够得到

于 2012-09-07T04:44:41.930 回答