4

私の組織では、ユーザーはWindowsステーション(95、Vista、および7)へのインタラクティブログインにスマートカードを使用する必要があります。ほぼ毎日、カスタムクレデンシャルマネージャーを実装せずに、スマートカードに保存されているクレデンシャルを読み取り、ActiveDirectoryと比較する必要があります。比較するフィールドは、userPrincialNameとsAMAccountNameです。

スマートカードからクレデンシャルを読み取る方法を示すコードを見せてください。または、インターネット上の記事/コードに案内してください。

インターネットでの検索では、クレデンシャルマネージャーの実装または他の言語(C、C ++など)の使用が提案されました。また、私はこの記事に出くわしました:http: //www.codeproject.com/Articles/17013/Smart-Card-SmartCardsを操作するためのフレームワークであるorouitによって書かれたFramework-for-NET-しかし、これは多すぎると思います私の簡単な仕事のために。どう思いますか?

4

1 に答える 1

8

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 を忘れないでください。

あなたは得ることができるでしょう

于 2012-09-07T04:44:41.930 に答える