Windows で開発している場合、スマート カードを挿入すると、Windows はスマート カードからすべての証明書を取得し、それらを My Certificate Store に配置します。
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 はあまり一貫性がなく、単純でもありません。ヒントとして、CryptAcquireContext の .NET バージョンは、必要に応じてコンテナー名を指定できる CspParameters を持つ RSACryptoServiceProvider です。
ActiveDirectory でのユーザーの検索は、System.DirectoryServices.DirectoyEntry および System.DirectoryServices.DirectorySearcher を介して行うことができますが、System.DirectoryServices.ActiveDirectory.Forest および関連する API を忘れないでください。
あなたは得ることができるでしょう