- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在我的组织中,用户必须使用智能卡交互式登录到 Windows 站(95、Vista 和 7)。几乎每天,我们都需要读取存储在智能卡中的凭据并将它们与 ActiveDirectory 进行比较,而无需实现自定义凭据管理器。我们比较的字段是:userPrincialName 和 sAMAccountName。
能否请您向我展示演示如何从智能卡读取凭据的代码,或者指导我阅读互联网上的文章/代码?
通过互联网搜索建议实现凭据管理器或使用其他语言(如 C、C++)。另外,我看到了这篇文章:http://www.codeproject.com/Articles/17013/Smart-Card-Framework-for-NET由 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
}
}
现在基本上可以通过 .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,这使得一些事情更容易弄清楚。
你可以得到
关于c# - 如何从 C# 中的智能卡读取凭据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11791036/
我是一名优秀的程序员,十分优秀!