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

C# 如何在c语言中从智能卡读取凭据#,c#,active-directory,credentials,smartcard,C#,Active Directory,Credentials,Smartcard,在我的组织中,用户必须使用智能卡以交互方式登录到Windows工作站(95、Vista和7)。几乎每天,我们都需要读取存储在智能卡中的凭据,并将其与ActiveDirectory进行比较,而无需实现自定义凭据管理器。我们比较的字段是:userPrincialName和sAMAccountName 请给我看一段代码,演示如何从智能卡读取凭据,或引导我阅读internet上的文章/代码,好吗 internet上的搜索建议实现凭据管理器或使用其他语言(如C、C++)。 此外,我还看到了这篇文章:由or

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

请给我看一段代码,演示如何从智能卡读取凭据,或引导我阅读internet上的文章/代码,好吗

internet上的搜索建议实现凭据管理器或使用其他语言(如C、C++)。
此外,我还看到了这篇文章:由orouit撰写,这是一个使用智能卡的框架——但我认为这对于我的简单任务来说太多了。您觉得怎么样?

如果在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
  }
}
var smartCardCerts=new List();
var myStore=new X509Store(StoreName.My,StoreLocation.CurrentUser);
打开(OpenFlags.ReadOnly);
foreach(myStore.Certificates中的X509Certificate2证书)
{
如果(!cert.HasPrivateKey)继续;//肯定不是智能卡
var rsa=cert.PrivateKey作为RSACryptoServiceProvider;
如果(rsa==null)继续;//不再是智能卡证书
if(rsa.CspKeyContainerInfo.HardwareDevice)//确定-智能卡
{
//检查rsa.CspKeyContainerInfo.KeyContainerName属性
//或rsa.CspKeyContainerInfo.ProviderName(您的智能卡提供商,例如
//斯伦贝谢Cryptoflex 4K的“斯伦贝谢加密服务提供商”
//卡片等
变量名称=证书名称;
rsa.SignData();//确认私钥的存在-最终进行身份验证
}
}
基本上,现在很多加密API都可以通过.NET获得,但您也可以直接使用API

例如,您可以通过以下方式直接访问智能卡:

CryptAcquireContext(&hProv,"\\.\<Reader Name>\<Container Name>",...)
CryptAcquireContext(&hProv,\\.\\,…)
其中,读卡器名称是读卡器名称,容器名称是上面代码段中的rsa.KeyContainerName。有多种方法可以访问类似的信息,加密API不是非常一致或直接。作为提示,CryptAcquireContext的.NET版本是RSACryptServiceProvider,带有CSP参数,您可以在其中指定cont如果需要,请输入用户名称

可以通过System.DirectoryServices.DirectoryEntry和System.DirectoryServices.DirectorySearcher在ActiveDirectory中很好地查找用户,但是不要忘记System.DirectoryServices.ActiveDirectory.Forest和相关的API,它们使一些事情更容易弄清楚


您将能够获得

我将与智能卡读卡器生产商联系,您将需要了解其驱动程序的API如何与智能卡一起工作看似简单,但外观可能具有欺骗性。正如Alex所说,您可能必须使用智能卡读卡器的API,但最有可能的是标准Windows API应该做到这一点k、 您找到的文章是必读的,遗憾的是,这种方法并没有过分。Alex-不幸的是,在读者的produer站点(本地制作人)上没有文档或API。谢谢dandan78,如果这篇文章是必须阅读的,那么我会这样做,并阅读它。祝你有一个愉快的一天。我同意,这不是一项简单的任务。Windows API不断变化,创建或附加到登录过程中可能会带来数月的乐趣。如果你不知道如何做,最好从卡供应商那里购买t已经实现了它。Windows 95,现在你必须是KDing,对吗?对吗?请?为了让它工作,我必须对此进行调整。你必须使用
myStore.open(OpenFlags.ReadOnly)打开证书存储
之前,您可以从中获取任何证书。其次,您不能循环通过
myStore
,而是要循环通过
myStore.certificates