смарт-карты;Smart cards

В этом разделе объясняется, каким образом приложения универсальной платформы для Windows (UWP) могут использовать смарт-карты для подключения пользователей к защищенным сетевым службам, включая получение доступа к физическим устройствам чтения смарт-карт, создание виртуальных смарт-карт, связь со смарт-картами, проверку подлинности пользователей, сброс ПИН-кодов пользователей и удаление или отключение смарт-карт.This topic explains how Universal Windows Platform (UWP) apps can use smart cards to connect users to secure network services, including how to access physical smart card readers, create virtual smart cards, communicate with smart cards, authenticate users, reset user PINs, and remove or disconnect smart cards.

Настройка манифеста приложенияConfigure the app manifest

Перед проверкой подлинности пользователей с помощью смарт-карт или виртуальных смарт-карт необходимо задать в файле проекта Package.appxmanifest возможность Общие сертификаты пользователей.Before your app can authenticate users using smart cards or virtual smart cards, you must set the Shared User Certificates capability in the project Package.appxmanifest file.

Доступ к подключенным устройствам чтения карт и смарт-картамAccess connected card readers and smart cards

Вы можете запросить наличие устройств чтения и подключенных смарт-карт, передав код устройства (заданный в DeviceInformation) методу SmartCardReader.FromIdAsync.You can query for readers and attached smart cards by passing the device ID (specified in DeviceInformation) to the SmartCardReader.FromIdAsync method. Для доступа к смарт-картам, подключенным к возвращенному устройству чтения, вызовите метод SmartCardReader.FindAllCardsAsync.To access the smart cards currently attached to the returned reader device, call SmartCardReader.FindAllCardsAsync.

string selector = SmartCardReader.GetDeviceSelector();
DeviceInformationCollection devices =
    await DeviceInformation.FindAllAsync(selector);

foreach (DeviceInformation device in devices)
{
    SmartCardReader reader =
        await SmartCardReader.FromIdAsync(device.Id);

    // For each reader, we want to find all the cards associated
    // with it.  Then we will create a SmartCardListItem for
    // each (reader, card) pair.
    IReadOnlyList<SmartCard> cards =
        await reader.FindAllCardsAsync();
}

Вы также должны разрешить приложению просматривать события CardAdded, реализовав метод для обработки реакции приложения на вставку карты.You should also enable your app to observe for CardAdded events by implementing a method to handle app behavior on card insertion.

private void reader_CardAdded(SmartCardReader sender, CardAddedEventArgs args)
{
  // A card has been inserted into the sender SmartCardReader.
}

Затем каждый возвращенный объект SmartCard можно передать в объект SmartCardProvisioning для доступа к методам, которые позволяют приложению обращаться к карте и настраивать ее конфигурацию.You can then pass each returned SmartCard object to SmartCardProvisioning to access the methods that allow your app to access and customize its configuration.

Создание виртуальной смарт-картыCreate a virtual smart card

Перед созданием виртуальной смарт-карты с помощью SmartCardProvisioning приложение должно указать понятное имя, ключ администратора и экземпляр SmartCardPinPolicy.To create a virtual smart card using SmartCardProvisioning, your app will first need to provide a friendly name, an admin key, and a SmartCardPinPolicy. Понятное имя обычно вводится в приложение, а само приложение должно предоставить ключ администратора и создать экземпляр текущей версии SmartCardPinPolicy, а затем передать все три значения в RequestVirtualSmartCardCreationAsync.The friendly name is generally something provided to the app, but your app will still need to provide an admin key and generate an instance of the current SmartCardPinPolicy before passing all three values to RequestVirtualSmartCardCreationAsync.

  1. Создайте новый экземпляр SmartCardPinPolicy.Create a new instance of a SmartCardPinPolicy
  2. Создайте ключ администратора, вызвав метод CryptographicBuffer.GenerateRandom со значением ключа администратора, предоставленным службой или средством управления.Generate the admin key value by calling CryptographicBuffer.GenerateRandom on the admin key value provided by the service or management tool.
  3. Передайте эти значения вместе со строкой FriendlyNameText в RequestVirtualSmartCardCreationAsync.Pass these values along with the FriendlyNameText string to RequestVirtualSmartCardCreationAsync.
SmartCardPinPolicy pinPolicy = new SmartCardPinPolicy();
pinPolicy.MinLength = 6;

IBuffer adminkey = CryptographicBuffer.GenerateRandom(24);

SmartCardProvisioning provisioning = await
     SmartCardProvisioning.RequestVirtualSmartCardCreationAsync(
          "Card friendly name",
          adminkey,
          pinPolicy);

Когда метод RequestVirtualSmartCardCreationAsync вернет связанный объект SmartCardProvisioning, виртуальная смарт-карта будет создана и готова к использованию.Once RequestVirtualSmartCardCreationAsync has returned the associated SmartCardProvisioning object, the virtual smart card is provisioned and ready for use.

Примечание

Чтобы создать виртуальную смарт-карту с помощью приложения UWP, пользователь, запускающий приложение, должен быть членом группы "Администраторы".In order to create a virtual smart card using a UWP app, the user running the app must be a member of the administrators group. Если пользователь не является членом группы "Администраторы", создание виртуальной смарт-карты завершится ошибкой.If the user is not a member of the administrators group, virtual smart card creation will fail.

Обработка запросов проверки подлинностиHandle authentication challenges

Для проверки подлинности со смарт-картами или виртуальными смарт-картами ваше приложение должно выполнять запросы на проверку по данным о ключе администратора, хранящимся на карте, и данным о ключе администратора, хранящимся на сервере проверки подлинности или в средстве управления.To authenticate with smart cards or virtual smart cards, your app must provide the behavior to complete challenges between the admin key data stored on the card, and the admin key data maintained by the authentication server or management tool.

В следующем коде показано, как поддерживать проверку подлинности с помощью смарт-карты для служб или изменение данных физической или виртуальной карты.The following code shows how to support smart card authentication for services or modification of physical or virtual card details. Если данные, созданные по ключу администратора на карте (challenge), совпадают с данными о ключе администратора, предоставленными сервером или средством управления (adminkey), то проверка подлинности проходит успешно.If the data generated using the admin key on the card ("challenge") is the same as the admin key data provided by the server or management tool ("adminkey"), authentication is successful.

static class ChallengeResponseAlgorithm
{
    public static IBuffer CalculateResponse(IBuffer challenge, IBuffer adminkey)
    {
        if (challenge == null)
            throw new ArgumentNullException("challenge");
        if (adminkey == null)
            throw new ArgumentNullException("adminkey");

        SymmetricKeyAlgorithmProvider objAlg = SymmetricKeyAlgorithmProvider.OpenAlgorithm(SymmetricAlgorithmNames.TripleDesCbc);
        var symmetricKey = objAlg.CreateSymmetricKey(adminkey);
        var buffEncrypted = CryptographicEngine.Encrypt(symmetricKey, challenge, null);
        return buffEncrypted;
    }
}

Ссылки на код будут встречаться в остальной части раздела, когда мы будем изучать выполнение действия проверки подлинности и внесение изменений в информацию на смарт-карте и виртуальной смарт-карте.You will see this code referenced throughout the remainder of this topic was we review how to complete an authentication action, and how to apply changes to smart card and virtual smart card information.

Проверка ответа при проверке подлинности с помощью смарт-карты или виртуальной смарт-картыVerify smart card or virtual smart card authentication response

Мы определили логику для запросов проверки подлинности и можем связаться с устройством чтения для доступа к смарт-карте или получить доступ к виртуальной смарт-карте для проверки подлинности.Now that we have the logic for authentication challenges defined, we can communicate with the reader to access the smart card, or alternatively, access a virtual smart card for authentication.

  1. Для начала запроса вызовите метод GetChallengeContextAsync из объекта SmartCardProvisioning, связанного со смарт-картой.To begin the challenge, call GetChallengeContextAsync from the SmartCardProvisioning object associated with the smart card. Будет создан экземпляр SmartCardChallengeContext, который содержит значение Challenge для карты.This will generate an instance of SmartCardChallengeContext, which contains the card's Challenge value.

  2. Затем передайте значение запроса карты и ключ администратора, предоставленный службой или средством управления, в ChallengeResponseAlgorithm , определенный в предыдущем примере.Next, pass the card's challenge value and the admin key provided by the service or management tool to the ChallengeResponseAlgorithm that we defined in the previous example.

  3. Если проверка подлинности проходит успешно, VerifyResponseAsync возвращает значение true.VerifyResponseAsync will return true if authentication is successful.

bool verifyResult = false;
SmartCard card = await rootPage.GetSmartCard();
SmartCardProvisioning provisioning =
    await SmartCardProvisioning.FromSmartCardAsync(card);

using (SmartCardChallengeContext context =
       await provisioning.GetChallengeContextAsync())
{
    IBuffer response = ChallengeResponseAlgorithm.CalculateResponse(
        context.Challenge,
        rootPage.AdminKey);

    verifyResult = await context.VerifyResponseAsync(response);
}

Изменение или сброс ПИН-кода пользователяChange or reset a user PIN

Чтобы изменить ПИН-код, связанный со смарт-картой, сделайте следующее.To change the PIN associated with a smart card:

  1. Обратитесь к карте и создайте связанный объект SmartCardProvisioning.Access the card and generate the associated SmartCardProvisioning object.
  2. Вызовите метод RequestPinChangeAsync, чтобы показать пользователю интерфейс для выполнения этой операции.Call RequestPinChangeAsync to display a UI to the user to complete this operation.
  3. Если ПИН-код успешно изменен, этот вызов возвращает значение true.If the PIN was successfully changed the call will return true.
SmartCardProvisioning provisioning =
    await SmartCardProvisioning.FromSmartCardAsync(card);

bool result = await provisioning.RequestPinChangeAsync();

Чтобы запросить сброс ПИН-кода, сделайте следующее.To request a PIN reset:

  1. Вызовите метод RequestPinResetAsync для запуска операции.Call RequestPinResetAsync to initiate the operation. В этот вызов входит метод SmartCardPinResetHandler, который представляет смарт-карту, и запрос на сброс ПИН-кода.This call includes a SmartCardPinResetHandler method that represents the smart card and the pin reset request.

  2. SmartCardPinResetHandler предоставляет информацию, которая используется алгоритмом ChallengeResponseAlgorithm, заключенным в вызов SmartCardPinResetDeferral, для сравнения значения запроса карты и ключа администратора, предоставленного службой или средством управления, для проверки подлинности запроса.SmartCardPinResetHandler provides information that our ChallengeResponseAlgorithm, wrapped in a SmartCardPinResetDeferral call, uses to compare the card's challenge value and the admin key provided by the service or management tool to authenticate the request.

  3. Если запрос выполняется успешно, то вызов RequestPinResetAsync завершается, и возвращается значение true, если ПИН-код успешно сброшен.If the challenge is successful, the RequestPinResetAsync call is completed; returning true if the PIN was successfully reset.

SmartCardProvisioning provisioning =
    await SmartCardProvisioning.FromSmartCardAsync(card);

bool result = await provisioning.RequestPinResetAsync(
    (pinResetSender, request) =>
    {
        SmartCardPinResetDeferral deferral =
            request.GetDeferral();

        try
        {
            IBuffer response =
                ChallengeResponseAlgorithm.CalculateResponse(
                    request.Challenge,
                    rootPage.AdminKey);
            request.SetResponse(response);
        }
        finally
        {
            deferral.Complete();
        }
    });
}

Удаление смарт-карты или виртуальной смарт-картыRemove a smart card or virtual smart card

При удалении физической смарт-карты создается событие CardRemoved.When a physical smart card is removed a CardRemoved event will fire when the card is deleted.

Свяжите создание этого события в устройстве чтения карт с методом, который определяет реакцию приложения на удаление карты или устройства чтения, в качестве обработчика событий.Associate the firing of this event with the card reader with the method that defines your app's behavior on card or reader removal as an event handler. Такой реакцией может быть простое уведомление пользователя об удалении карты.This behavior can be something as simply as providing notification to the user that the card was removed.

reader = card.Reader;
reader.CardRemoved += HandleCardRemoved;

Удаление виртуальной смарт-карты обрабатывается в программном коде. Сначала запрашивается карта, а затем вызывается метод RequestVirtualSmartCardDeletionAsync из возвращенного объекта SmartCardProvisioning.The removal of a virtual smart card is handled programmatically by first retrieving the card and then calling RequestVirtualSmartCardDeletionAsync from the SmartCardProvisioning returned object.

bool result = await SmartCardProvisioning
    .RequestVirtualSmartCardDeletionAsync(card);