Вопрос по c#, smartcard, active-directory, credentials – Как читать учетные данные со смарт-карты в C #

2

В моей организации пользователи должны использовать SmartCard для интерактивного входа на станции Windows (95, Vista и 7). почти ежедневно нам нужно читать учетные данные, хранящиеся на смарт-карте, и сравнивать их с ActiveDirectory, не используя настраиваемый менеджер учетных данных. Мы сравниваем следующие поля: userPrincialName и sAMAccountName.

Не могли бы вы показать мне код, который демонстрирует, как читать учетные данные со смарт-карты, или направить меня к статье / коду в Интернете?

Поиск в Интернете предложил реализовать менеджер учетных данных или использовать другие языки (например, C, C ++). Также я наткнулся на эту статью:http://www.codeproject.com/Articles/17013/Smart-Card-Framework-for-NET написанный orouit, который является основой для работы со SmartCards - но я думаю, что это слишком много для моей простой задачи. Как вы думаете?

Я уточню у производителя устройства чтения смарт-карт, вам нужно узнать, как работает API его драйвера. Alex
Работа со смарт-картами может показаться простой задачей, но внешний вид может быть обманчивым. Как сказал Алекс, вам, возможно, придется использовать API-интерфейс устройства чтения смарт-карт, но, скорее всего, стандартный API-интерфейс Windows должен сработать. Статья, которую вы нашли, является обязательной для прочтения, и, к сожалению, этот подход не является чрезмерным dandan78
Алекс. К сожалению, на сайте продюсера (местного производителя) нет документации или API. Спасибо dandan78, Если статья обязательна к прочтению, я сделаю это и прочту. Хорошего дня. Hamed Salameh
Windows 95, теперь вы должны быть kdding, верно? Правильно? Пожалуйста? Maarten Bodewes
Я согласен, это не простая задачаat all, Windows API постоянно меняется, и создание или добавление к процессу входа может привести кmonths весело. Если вы не знаете, как это сделать, вам гораздо лучше купить его у продавца карты, который уже внедрил его. Maarten Bodewes

Ваш Ответ

1   ответ
5

Хорошо, если вы разрабатываете под Windows, после того, как вы вставите смарт-карту, окна получат все сертификаты со смарт-карты и поместят их в хранилище сертификатов My.

var smartCardCerts = new List<X509Certificate2>();
var myStore = new X509Store(StoreName.My, StoreLocation.CurrentUser);
foreach(X509Certificate2 cert in myStore)
{
  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 - это RSACryptoServiceProvider с CspParameters, где вы можете указать имя контейнера, если это необходимо.

Хорошо найти пользователя в ActiveDirectory можно с помощью System.DirectoryServices.DirectoyEntry и System.DirectoryServices.DirectorySearcher, но не забывайте System.DirectoryServices.ActiveDirectory.Forest и связанный с ним API, который значительно упрощает понимание некоторых вещей.

Вы сможете получить

Я должен был внести изменения в это, чтобы заставить его работать. Вы должны открыть хранилище сертификатов, используяmyStore.Open(OpenFlags.ReadOnly) прежде чем вы сможете получить какие-либо сертификаты от него. Во-вторых, вы не можете перебиратьmyStore вместо этого вы хотите перебратьmyStore.Certificates.

Похожие вопросы