Разблокировка Windows с устройствами компаньона Windows Hello (IoT)

Устройство-компаньон Windows Hello — это устройство, которое может работать вместе с рабочим столом Windows 10, чтобы улучшить взаимодействие с проверкой подлинности пользователей. Используя платформу устройства-компаньона Windows Hello, устройство-компаньон может обеспечить широкий интерфейс для Windows Hello, даже если биометрические данные недоступны (например, если на рабочем столе Windows 10 отсутствует камера для проверки подлинности лиц или устройства средства чтения отпечатков пальцев, например).

Примечание.

API для платформы устройства-компаньона Windows Hello устарел в Windows 10 версии 2004.

Введение

Примеры кода см. в репозитории платформы Github платформы вспомогательных устройств Windows Hello.

Случаи использования

Существует множество способов использовать платформу устройства-компаньона Windows Hello для создания отличного интерфейса разблокировки Windows с устройством-компаньоном. Например, пользователи могут:

  • Подключите устройство-компаньон к компьютеру через USB, нажмите кнопку на устройстве-компаньоне и автоматически разблокируйте свой компьютер.
  • Нести телефон в кармане, который уже связан с ПК по Bluetooth. После нажатия пробела на своем компьютере их телефон получает уведомление. Утверждайте его, и компьютер просто разблокирует.
  • Коснитесь устройства-компаньона к средству чтения NFC, чтобы быстро разблокировать компьютер.
  • Носить фитнес-группу, которая уже прошел проверку подлинности владельца. При приближении к компьютеру и выполнении специального жеста (например, хлопания), компьютер разблокирует.

Биометрические устройства с поддержкой компаньона Windows Hello

Если устройство-компаньон поддерживает биометрические данные, в некоторых случаях биометрические платформы Windows могут быть лучшим решением, чем платформа устройства-компаньона Windows Hello.

Компоненты решения

На приведенной ниже схеме показаны компоненты решения и ответственные за их создание.

Обзор платформы

Платформа устройства-компаньона Windows Hello реализована в качестве службы, работающей в Windows (называемой службой проверки подлинности компаньона в этой статье). Эта служба отвечает за создание маркера разблокировки, который должен быть защищен ключом HMAC, хранящимся на устройстве-компаньоне Windows Hello. Это гарантирует, что доступ к маркеру разблокировки требует наличия устройства-компаньона Windows Hello. Для каждого кортежа (ПК, пользователя Windows) будет уникальный маркер разблокировки.

Для интеграции с платформой устройств Windows Hello Companion требуется:

  • Приложение устройства-компаньона Windows Hello для универсальная платформа Windows (UWP) для устройства-компаньона, скачанный из магазина приложений Windows.
  • Возможность создания двух 256-разрядных ключей HMAC на устройстве-компаньоне Windows Hello и создания HMAC с ним (с помощью SHA-256).
  • Параметры безопасности на рабочем столе Windows 10 правильно настроены. Службе проверки подлинности компаньона потребуется настроить этот ПИН-код перед подключением любого устройства-компаньона Windows Hello. Пользователи должны настроить ПИН-код с помощью > параметров входа учетных записей > .

Помимо указанных выше требований приложение устройства-компаньона Windows Hello отвечает за:

  • Взаимодействие с пользователем и фирменной символики начальной регистрации и последующее отмена регистрации устройства-компаньона Windows Hello.
  • Работая в фоновом режиме, обнаружив устройство компаньона Windows Hello, взаимодействуя с устройством компаньона Windows Hello, а также службой проверки подлинности компаньона.
  • Обработка ошибок

Как правило, устройства-компаньоны поставляются с приложением для первоначальной настройки, например настройка фитнес-группы в первый раз. Функции, описанные в этом документе, могут быть частью этого приложения, и отдельное приложение не должно быть обязательным.

Сигналы пользователя

Каждое устройство-компаньон Windows Hello должно сочетаться с приложением, поддерживающим три сигнала пользователя. Эти сигналы могут быть в виде действия или жеста.

  • Сигнал намерения: позволяет пользователю показывать свое намерение разблокировать, например, нажимая кнопку на устройстве-компаньоне Windows Hello. Сигнал намерения должен быть собран на стороне устройства-компаньона Windows Hello.
  • Сигнал присутствия пользователя: подтверждает наличие пользователя. Например, устройство-компаньон Windows Hello может требовать ПИН-код, прежде чем его можно будет использовать для разблокировки компьютера (не путать с ПИН-кодом компьютера), или может потребоваться нажать кнопку.
  • Сигнал диамбигуации: диамбигуирует, какой рабочий стол Windows 10 пользователь хочет разблокировать, когда для устройства-компаньона Windows Hello доступны несколько вариантов.

Любое количество этих сигналов пользователя можно объединить в один. Для каждого использования должны потребоваться сигналы о присутствии и намерении пользователей.

Регистрация и будущий обмен данными между устройствами-компаньонами Windows Hello и ПК

Прежде чем устройство-компаньон Windows Hello можно подключить к платформе устройства-компаньона Windows Hello, его необходимо зарегистрировать в платформе. Интерфейс регистрации полностью принадлежит приложению устройства-компаньона Windows Hello.

Связь между устройством-компаньоном Windows Hello и настольным устройством Windows 10 может быть одним ко многим (т. е. одно устройство-компаньон может использоваться для многих настольных устройств с Windows 10). Однако каждое устройство-компаньон Windows Hello можно использовать только для одного пользователя на каждом классическом устройстве с Windows 10.

Прежде чем устройство-компаньон Windows Hello может взаимодействовать с компьютером, им необходимо согласиться на использование транспорта. Такой выбор остается в приложении устройства-компаньона Windows Hello; Платформа устройства-компаньона Windows Hello не накладывает никаких ограничений на тип транспорта (USB, NFC, Wi-Fi, BT, BLE и т. д.) или протокол, используемый между устройством компаньона Windows Hello и приложением устройства-компаньона Windows Hello на стороне классического устройства Windows 10. Однако он предлагает некоторые рекомендации по обеспечению безопасности для уровня транспорта, как описано в разделе "Требования к безопасности" этого документа. Это ответственность поставщика устройств для предоставления этих требований. Платформа не предоставляет их для вас.

Модель взаимодействия с пользователем

Обнаружение, установка и регистрация приложений-компаньонов Windows Hello

Типичный рабочий процесс пользователя выглядит следующим образом:

  • Пользователь настраивает ПИН-код на каждом из целевых настольных устройств Windows 10, которые она хочет разблокировать с этим устройством-компаньоном Windows Hello.
  • Пользователь запускает приложение устройства-компаньона Windows Hello на классическом устройстве с Windows 10, чтобы зарегистрировать свое устройство-компаньон Windows Hello на рабочем столе с Windows 10.

Примечания:

  • Рекомендуется упростить обнаружение, скачивание и запуск приложения устройства-компаньона Windows Hello, а также автоматически (например, приложение можно скачать при нажатии устройства-компаньона Windows Hello на стороне устройства NFC на стороне классического устройства Windows 10). Однако это ответственность за устройство компаньона Windows Hello и приложение устройства-компаньона Windows Hello.
  • В корпоративной среде приложение устройства-компаньона Windows Hello можно развернуть с помощью MDM.
  • Приложение устройства-компаньона Windows Hello отвечает за отображение пользователем любых сообщений об ошибках, которые происходят в процессе регистрации.

Протокол регистрации и отмены регистрации

На следующей схеме показано, как устройство-компаньон Windows Hello взаимодействует со службой проверки подлинности компаньона во время регистрации.

Схема потока регистрации.

В нашем протоколе используются два ключа:

  • Ключ устройства (devicekey): используется для защиты маркеров разблокировки, необходимых компьютеру для разблокировки Windows.
  • Ключ проверки подлинности (authkey): используется для взаимной проверки подлинности устройства-компаньона Windows Hello и службы проверки подлинности компаньона.

Ключ устройства и ключи проверки подлинности обмениваются во время регистрации между приложением устройства-компаньона Windows Hello и устройством-компаньоном Windows Hello. В результате приложение устройства-компаньона Windows Hello и устройство-компаньон Windows Hello должны использовать безопасный транспорт для защиты ключей.

Кроме того, обратите внимание, что на приведенной выше схеме отображаются два ключа HMAC, создаваемых на устройстве-компаньоне Windows Hello, также можно создать их и отправить их на устройство-компаньон Windows Hello для хранения.

Запуск потоков проверки подлинности

Существует два способа запуска потока входа на рабочий стол Windows 10 с помощью платформы устройств-компаньонов Windows Hello (т. е. предоставить сигнал намерения):

  • Откройте крышку на ноутбуке или нажмите пробел или проведите пальцем вверх на компьютере.
  • Выполните жест или действие на стороне устройства-компаньона Windows Hello.

Это выбор устройства-компаньона Windows Hello, чтобы выбрать, какой из них является отправной точкой. Платформа устройства-компаньона Windows Hello сообщает приложению устройства-компаньона при возникновении варианта. Для двух вариантов приложение устройства-компаньона Windows Hello должно запросить устройство-компаньона, чтобы узнать, было ли записано это событие. Это гарантирует, что устройство-компаньон Windows Hello собирает сигнал намерения до успешной разблокировки.

Поставщик учетных данных устройства-компаньона Windows Hello

В Windows 10 есть новый поставщик учетных данных, который обрабатывает все устройства-компаньоны Windows Hello.

Поставщик учетных данных устройства-компаньона Windows Hello отвечает за запуск фоновой задачи устройства-компаньона с помощью активации триггера. Триггер устанавливается при первом пробуждении компьютера и отображении экрана блокировки. Во второй раз компьютер вводит пользовательский интерфейс входа, а поставщик учетных данных устройства-компаньона Windows Hello — это выбранная плитка.

Вспомогательные библиотеки для приложения устройства-компаньона Windows Hello будут прослушивать изменение состояния экрана блокировки и отправлять событие, соответствующее фоновой задаче устройства-компаньона Windows Hello.

Если есть несколько фоновых задач устройства-компаньона Windows Hello, первая фоновая задача, завершиющая процесс проверки подлинности, разблокирует компьютер. Служба проверки подлинности устройства-компаньона будет игнорировать все остальные вызовы проверки подлинности.

Интерфейс на стороне устройства-компаньона Windows Hello принадлежит и управляется приложением устройства-компаньона Windows Hello. Платформа устройства-компаньона Windows Hello не контролирует эту часть взаимодействия с пользователем. В частности, поставщик проверки подлинности компаньона сообщает приложению устройства-компаньона Windows Hello (через фоновое приложение) об изменениях состояния в пользовательском интерфейсе входа (например, экран блокировки просто сошел, или пользователь просто развеял экран блокировки путем нажатия пробела), и это ответственность за приложение устройства-компаньона Windows Hello для создания взаимодействия с этим (например, после нажатия пробела и разблокировки экрана разблокировки начните искать устройство через USB).

Платформа устройства-компаньона Windows Hello предоставит сток (локализованные) текст и сообщения об ошибках для приложения-компаньона Windows Hello, чтобы выбрать один из вариантов. Они будут отображаться на верхней части экрана блокировки (или в пользовательском интерфейсе входа). Дополнительные сведения см. в разделе "Работа с сообщениями и ошибками".

Протокол аутентификации

После запуска фоновой задачи, связанной с приложением устройства-компаньона Windows Hello, она отвечает за запрос устройства-компаньона Windows Hello для проверки значения HMAC, вычисленного службой проверки подлинности компаньона, и поможет вычислить два значения HMAC:

  • Проверка service HMAC = HMAC(ключ проверки подлинности, service nonce || device nonce || сеанс nonce).
  • Вычислите HMAC ключа устройства с помощью nonce.
  • Вычислите HMAC ключа проверки подлинности с первым значением HMAC, объединенным с нецем, созданным службой проверки подлинности компаньона.

Второе вычисляемое значение используется службой для проверки подлинности устройства, а также предотвращения атаки воспроизведения в транспортном канале.

Схема обновленного потока регистрации.

Управление жизненным циклом

Регистрация один раз, использование везде

Без внутреннего сервера пользователи должны зарегистрировать свое устройство-компаньон Windows Hello с каждым настольным устройством Windows 10 отдельно.

Поставщик устройства-компаньон или OEM может реализовать веб-службу для перемещения состояния регистрации на настольных компьютерах или мобильных устройствах с Windows 10. Дополнительные сведения см. в разделе "Роуминг", "Отзыв" и "Фильтрация службы".

Управление ПИН-кодами

Прежде чем использовать устройство-компаньон, необходимо настроить ПИН-код на классическом устройстве с Windows 10. Это гарантирует, что пользователь имеет резервную копию в случае, если устройство-компаньон Windows Hello не работает. ПИН-код — это то, что windows управляет и что приложения никогда не видят. Чтобы изменить его, пользователь переходит к параметрам входа в учетные > > записи параметров.

Управление и политика

Пользователи могут удалить устройство-компаньон Windows Hello из настольных компьютеров с Windows 10, запустив приложение устройства-компаньона Windows Hello на этом классическом устройстве.

Предприятия имеют два варианта управления платформой устройства-компаньона Windows Hello:

  • Включение или отключение функции
  • Определение списка разрешений устройств-компаньонов Windows Hello, разрешенных с помощью locker приложений Windows

Платформа устройства-компаньона Windows Hello не поддерживает централизованный способ хранения инвентаризации доступных устройств-компаньонов или метод для дальнейшего фильтрации экземпляров типа устройства-компаньона Windows Hello (например, разрешено только устройство-компаньон с серийным номером между X и Y). Однако разработчики приложений могут создавать службу для предоставления таких функций. Дополнительные сведения см. в разделе "Роуминг", "Отзыв" и "Фильтрация службы".

отзыва

Платформа устройства-компаньона Windows Hello не поддерживает удаление устройства-компаньона с определенного устройства windows 10 на рабочем столе удаленно. Вместо этого пользователи могут удалить устройство компаньона Windows Hello с помощью приложения устройства-компаньона Windows Hello, работающего на рабочем столе с Windows 10.

Однако поставщики устройств-компаньонов могут создавать службу для предоставления функций удаленного отзыва. Дополнительные сведения см. в разделе "Роуминг", "Отзыв" и "Фильтрация службы".

Роуминг и фильтрация служб

Поставщики устройств-компаньонов могут реализовать веб-службу, которую можно использовать для следующих сценариев:

  • Служба фильтров для предприятия: предприятие может ограничить набор устройств-компаньонов Windows Hello, которые могут работать в своей среде, чтобы выбрать несколько из определенного поставщика. Например, компания Contoso может заказать 10 000 устройств-компаньонов модели Y от поставщика X и убедиться, что только эти устройства будут работать в домене Contoso (а не любой другой модели устройства от поставщика X).
  • Инвентаризация: предприятие может определить список существующих устройств-компаньонов, используемых в корпоративной среде.
  • Отзыв в режиме реального времени: если сотрудник сообщает, что его устройство-компаньон потеряно или украдено, веб-служба может использоваться для отзыва этого устройства.
  • Роуминг: пользователь должен зарегистрировать свое устройство-компаньон один раз, и он работает на всех своих настольных компьютерах Windows 10 и Mobile.

Для реализации этих функций необходимо, чтобы приложение устройства-компаньона Windows Hello проверялось с веб-службой во время регистрации и использования. Приложение устройства-компаньона Windows Hello может оптимизировать для кэшированных сценариев входа, таких как требование проверки с веб-службой только один раз в день (за счет расширения срока отзыва до одного дня).

Модель API платформы устройств-компаньона Windows Hello

Обзор

Приложение устройства-компаньона Windows Hello должно содержать два компонента: приложение переднего плана с пользовательским интерфейсом, ответственным за регистрацию и отмену регистрации устройства, а также фоновую задачу, которая обрабатывает проверку подлинности.

Общий поток API выглядит следующим образом:

  1. Регистрация устройства-компаньона Windows Hello
    • Убедитесь, что устройство находится рядом и запрашивает его возможность (при необходимости)
    • Создайте два ключа HMAC (на стороне устройства-компаньона или на стороне приложения)
    • Вызов RequestStartRegisteringDeviceAsync
    • Вызов FinishRegisteringDeviceAsync
    • Убедитесь, что приложение-компаньон Windows Hello хранит ключи HMAC (если это поддерживается), а приложение-компаньон Windows Hello удаляет свои копии.
  2. Регистрация фоновой задачи
  3. Дождитесь правильного события в фоновой задаче
    • WaitForUserConfirmation: дождитесь этого события, если для запуска потока проверки подлинности требуется действие или жест пользователя на стороне устройства-компаньона Windows Hello.
    • СборCredential: дождитесь этого события, если устройство-компаньон Windows Hello использует действие пользователя или жест на стороне компьютера, чтобы запустить поток проверки подлинности (например, нажав пробел)
    • Другой триггер, например смарт-карта: обязательно запрашивайте текущее состояние проверки подлинности для вызова правильных API.
  4. Оставить пользователю информацию об сообщениях об ошибках или выполните следующие действия, вызвав ShowNotificationMessageAsync. Вызов этого API только после сбора сигнала намерения
  5. Отпирать
    • Убедитесь, что были собраны сигналы о намерении и присутствии пользователей
    • Вызов StartAuthenticationAsync
    • Обмен данными с устройством-компаньоном для выполнения необходимых операций HMAC
    • Вызов FinishAuthenticationAsync
  6. Отмена регистрации устройства-компаньона Windows Hello, когда пользователь запрашивает его (например, если он потерял свое компаньонное устройство)
    • Перечисление устройства-компаньона Windows Hello для входа пользователя с помощью FindAllRegisteredDeviceInfoAsync
    • Отмена регистрации с помощью UnregisterDeviceAsync

Регистрация и отмена регистрации

Регистрация требует двух вызовов API в службу проверки подлинности компаньона: RequestStartRegisteringDeviceAsync и FinishRegisteringDeviceAsync.

Перед выполнением любого из этих вызовов приложение устройства-компаньона Windows Hello должно убедиться, что устройство-компаньон Windows Hello доступно. Если устройство-компаньон Windows Hello отвечает за создание ключей HMAC (аутентификации и ключей устройств), приложение устройства-компаньона Windows Hello также должно попросить устройство-компаньон создать их перед выполнением любого из указанных выше двух вызовов. Если приложение устройства-компаньона Windows Hello отвечает за создание ключей HMAC, это необходимо сделать перед вызовом приведенных выше двух вызовов.

Кроме того, в рамках первого вызова API (RequestStartRegisteringDeviceAsync) приложение устройства-компаньона Windows Hello должно решить возможность устройства и подготовиться к передаче его в рамках вызова API; Например, поддерживает ли устройство-компаньон Windows Hello безопасное хранилище для ключей HMAC. Если одно и то же приложение устройства-компаньона Windows Hello используется для управления несколькими версиями одного и того же устройства-компаньона и изменения этих возможностей (и требуется запрос устройства для принятия решения), рекомендуется выполнить эти запросы перед первым вызовом API.

Первый API (RequestStartRegisteringDeviceAsync) возвращает дескриптор, используемый вторым API (FinishRegisteringDeviceAsync). Первый вызов регистрации запустит пин-код, чтобы убедиться, что пользователь присутствует. Если ПИН-код не настроен, этот вызов завершится ошибкой. Приложение устройства-компаньона Windows Hello может запрашивать, настроен ли ПИН-код с помощью вызова KeyCredentialManager.IsSupportedAsync. Вызов RequestStartRegisteringDeviceAsync также может завершиться ошибкой, если политика отключила использование устройства-компаньона Windows Hello.

Результат первого вызова возвращается через перечисление SecondaryAuthenticationFactorRegistrationStatus:

{
	Failed = 0, 		// Something went wrong in the underlying components
	Started,     		// First call succeeded
	CanceledByUser,  	// User cancelled PIN prompt
	PinSetupRequired,	// PIN is not set up
	DisabledByPolicy,	// Companion device framework or this app is disabled
}

Второй вызов (FinishRegisteringDeviceAsync) завершает регистрацию. В процессе регистрации приложение устройства-компаньона Windows Hello может хранить данные конфигурации устройства-компаньона с помощью службы проверки подлинности компаньона. Для этих данных существует ограничение размера 4K. Эти данные будут доступны приложению устройства-компаньона Windows Hello во время проверки подлинности. Эти данные можно использовать в качестве примера для подключения к устройству-компаньону Windows Hello, например MAC-адресу, или если устройство-компаньон Windows Hello не имеет хранилища и компаньона устройства, которое хочет использовать компьютер для хранения, можно использовать данные конфигурации. Обратите внимание, что все конфиденциальные данные, хранящиеся в составе данных конфигурации, должны быть зашифрованы с помощью ключа, который знает только устройство-компаньон Windows Hello. Кроме того, учитывая, что данные конфигурации хранятся службой Windows, оно доступно приложению устройства-компаньона Windows Hello в профилях пользователей.

Приложение устройства-компаньона Windows Hello может вызвать AbortRegisteringDeviceAsync, чтобы отменить регистрацию и передать код ошибки. Служба проверки подлинности компаньона регистрирует ошибку в данных телеметрии. Хороший пример для этого вызова может быть, когда что-то пошло не так с устройством компаньона Windows Hello и не удалось завершить регистрацию (например, он не может хранить ключи HMAC или подключение BT было потеряно).

Приложение устройства-компаньона Windows Hello должно предоставить пользователю возможность отмены регистрации устройства-компаньона Windows Hello с рабочего стола Windows 10 (например, если они потеряли свое компаньонное устройство или приобрели более новую версию). Когда пользователь выбирает этот параметр, приложение устройства-компаньона Windows Hello должно вызывать unregisterDeviceAsync. Этот вызов приложением устройства-компаньона Windows Hello активирует службу проверки подлинности устройства-компаньона, чтобы удалить все данные (включая ключи HMAC), соответствующие определенному идентификатору устройства и AppId приложения вызывающего устройства с стороны КОМПЬЮТЕРА. Этот вызов API не пытается удалить ключи HMAC из приложения устройства-компаньона Windows Hello или устройства-компаньона. Это осталось для реализации приложения устройства-компаньона Windows Hello.

Приложение устройства-компаньона Windows Hello отвечает за отображение сообщений об ошибках, происходящих на этапе регистрации и отмены регистрации.

using System;
using Windows.Security.Authentication.Identity.Provider;
using Windows.Storage.Streams;
using Windows.Security.Cryptography;
using Windows.UI.Popups;

namespace SecondaryAuthFactorSample
{
	public class DeviceRegistration
	{

		public void async OnRegisterButtonClick()
		{
			//
			// Pseudo function, the deviceId should be retrieved by the application from the device
			//
			string deviceId = await ReadSerialNumberFromDevice();

			IBuffer deviceKey = CryptographicBuffer.GenerateRandom(256/8);
			IBuffer mutualAuthenticationKey = CryptographicBuffer.GenerateRandom(256/8);

			SecondaryAuthenticationFactorRegistration registrationResult =
				await SecondaryAuthenticationFactorRegistration.RequestStartRegisteringDeviceAsync(
					deviceId,  // deviceId: max 40 wide characters. For example, serial number of the device
					SecondaryAuthenticationFactorDeviceCapabilities.SecureStorage |
						SecondaryAuthenticationFactorDeviceCapabilities.HMacSha256 |
						SecondaryAuthenticationFactorDeviceCapabilities.StoreKeys,
					"My test device 1", // deviceFriendlyName: max 64 wide characters. For example: John's card
					"SAMPLE-001", // deviceModelNumber: max 32 wide characters. The app should read the model number from device.
					deviceKey,
					mutualAuthenticationKey);

			switch(registerResult.Status)
			{
			case SecondaryAuthenticationFactorRegistrationStatus.Started:
				//
				// Pseudo function:
				// The app needs to retrieve the value from device and set into opaqueBlob
				//
				IBuffer deviceConfigData = ReadConfigurationDataFromDevice();

				if (deviceConfigData != null)
				{
					await registrationResult.Registration.FinishRegisteringDeviceAsync(deviceConfigData); //config data limited to 4096 bytes
					MessageDialog dialog = new MessageDialog("The device is registered correctly.");
					await dialog.ShowAsync();
				}
				else
				{
					await registrationResult.Registration.AbortRegisteringDeviceAsync("Failed to connect to the device");
					MessageDialog dialog = new MessageDialog("Failed to connect to the device.");
					await dialog.ShowAsync();
				}
				break;

			case SecondaryAuthenticationFactorRegistrationStatus.CanceledByUser:
				MessageDialog dialog = new MessageDialog("You didn't enter your PIN.");
				await dialog.ShowAsync();
				break;

			case SecondaryAuthenticationFactorRegistrationStatus.PinSetupRequired:
				MessageDialog dialog = new MessageDialog("Please setup PIN in settings.");
				await dialog.ShowAsync();
				break;

			case SecondaryAuthenticationFactorRegistrationStatus.DisabledByPolicy:
				MessageDialog dialog = new MessageDialog("Your enterprise prevents using this device to sign in.");
				await dialog.ShowAsync();
				break;
			}
		}

		public void async UpdateDeviceList()
		{
			IReadOnlyList<SecondaryAuthenticationFactorInfo> deviceInfoList =
				await SecondaryAuthenticationFactorRegistration.FindAllRegisteredDeviceInfoAsync(
					SecondaryAuthenticationFactorDeviceFindScope.User);

			if (deviceInfoList.Count > 0)
			{
				foreach (SecondaryAuthenticationFactorInfo deviceInfo in deviceInfoList)
				{
					//
					// Add deviceInfo.FriendlyName and deviceInfo.DeviceId into a combo box
					//
				}
			}
		}

		public void async OnUnregisterButtonClick()
		{
			string deviceId;
			//
			// Read the deviceId from the selected item in the combo box
			//
			await SecondaryAuthenticationFactorRegistration.UnregisterDeviceAsync(deviceId);
		}
	}
}

Проверка подлинности

Для проверки подлинности требуется два вызова API в службу проверки подлинности компаньона: StartAuthenticationAsync и FinishAuthencationAsync.

Первый API запуска возвращает дескриптор, используемый вторым API. Первый вызов возвращает, помимо прочего, нецелевое значение, которое после объединения с другими вещами необходимо использовать HMAC с ключом устройства, хранящимся на устройстве-компаньоне Windows Hello. Второй вызов возвращает результаты HMAC с ключом устройства и может завершиться успешной проверкой подлинности (т. е. пользователь увидит свой рабочий стол).

Первый API запуска (StartAuthenticationAsync) может завершиться ошибкой, если политика отключила устройство-компаньон Windows Hello после начальной регистрации. Это также может завершиться ошибкой, если вызов API был выполнен вне состояния WaitForUserConfirmation или CollectingCredential (подробнее об этом далее в этом разделе). Это также может завершиться ошибкой, если приложение устройства-компаньона без регистрации вызывает его. SecondaryAuthenticationFactorAuthenticationStatus Enum суммирует возможные результаты:

{
	Failed = 0, 					// Something went wrong in the underlying components
	Started,
	UnknownDevice,    				// Companion device app is not registered with framework
	DisabledByPolicy, 				// Policy disabled this device after registration
	InvalidAuthenticationStage,		// Companion device framework is not currently accepting
									// incoming authentication requests
}

Второй вызов API (FinishAuthencationAsync) может завершиться ошибкой, если срок действия, указанный в первом вызове, истек (20 секунд). Перечисление SecondaryAuthenticationFactorFinishAuthenticationStatus фиксирует возможные результаты.

{
	Failed = 0, 	// Something went wrong in the underlying components
	Completed,   	// Success
	NonceExpired,   // Nonce is expired
}

Время двух вызовов API (StartAuthenticationAsync и FinishAuthencationAsync) должно соответствовать тому, как устройство-компаньон Windows Hello собирает намерения, присутствие пользователя и сигналы диамбигуации (дополнительные сведения см. в разделе "Сигналы пользователей"). Например, второй вызов не должен быть отправлен, пока не будет доступен сигнал намерения. Другими словами, компьютер не должен разблокировать, если пользователь не выразил намерения для него. Чтобы сделать это более понятным, предположим, что близкое взаимодействие Bluetooth используется для разблокировки компьютера, то должен быть собран явный сигнал намерения, в противном случае, как только пользователь идет по компьютеру на пути к кухне, компьютер разблокируется. Кроме того, значение nonce, возвращаемое из первого вызова, является ограничением времени (20 секунд) и истекает после определенного периода. В результате первый вызов должен выполняться только в том случае, если приложение устройства-компаньона Windows Hello имеет хорошее представление о присутствии устройства-компаньона, например, устройство-компаньон вставляется в USB-порт или используется средство чтения NFC. При использовании Bluetooth необходимо соблюдать осторожность, чтобы не влиять на батарею на стороне компьютера или влиять на другие действия Bluetooth, которые выполняются в этот момент при проверке присутствия устройства-компаньона Windows Hello. Кроме того, если необходимо предоставить сигнал о присутствии пользователя (например, введя ПИН-код), рекомендуется выполнить первый вызов проверки подлинности только после сбора этого сигнала.

Платформа устройства-компаньона Windows Hello помогает приложению устройства-компаньона Windows Hello принимать обоснованные решения о том, когда следует выполнять выше двух вызовов, предоставляя полное представление о том, где пользователь находится в потоке проверки подлинности. Платформа устройства-компаньона Windows Hello предоставляет эту функцию, предоставляя уведомление об изменении состояния блокировки фоновой задаче приложения.

поток устройства-компаньона

Ниже приведены сведения о каждом из этих состояний:

State Description
WaitForUserConfirmation Это событие уведомления об изменении состояния запускается при спада экрана блокировки (например, при нажатии пользователем Windows +L). Рекомендуется не запрашивать сообщения об ошибках, связанные с поиском устройства в этом состоянии. Как правило, мы рекомендуем отображать только сообщения, когда сигнал намерения доступен. Приложение устройства-компаньона Windows Hello должно сделать первый вызов API для проверки подлинности в этом состоянии, если устройство-компаньон собирает сигнал намерения (например, касание средства чтения NFC, нажатие кнопки на устройстве-компаньоне или определенный жест, например хлопания), а фоновая задача приложения-компаньона Windows Hello получает указание от устройства-компаньона, которое сигнал намерения обнаружен. В противном случае, если приложение устройства-компаньона Windows Hello использует компьютер для запуска потока проверки подлинности (проводите пальцем вверх по экрану разблокировки или нажимая пробел), приложение устройства-компаньона Windows Hello должно ожидать следующего состояния (СборCredential).
СборCredential Это событие уведомления об изменении состояния запускается, когда пользователь открывает крышку ноутбука, нажимает любой ключ на клавиатуре или проводит пальцем вверх по экрану разблокировки. Если устройство-компаньон Windows Hello использует указанные выше действия, чтобы начать сбор сигнала намерения, приложение устройства-компаньона Windows Hello должно начать собирать его (например, через всплывающее окно на устройстве-компаньоне, спрашивая, хочет ли пользователь разблокировать компьютер). Это было бы хорошее время для предоставления ошибок, если приложение устройства-компаньона Windows Hello должно предоставить пользователю сигнал о присутствии пользователя на устройстве-компаньоне (например, ввод ПИН-кода на устройстве компаньона Windows Hello).
Приостановка проверки подлинности Когда приложение устройства-компаньона Windows Hello получает это состояние, это означает, что служба проверки подлинности компаньона перестала принимать запросы проверки подлинности.
CredentialCollected Это означает, что другое приложение устройства-компаньона Windows Hello назвало второй API и что служба проверки подлинности компаньона проверяет, что было отправлено. На этом этапе служба проверки подлинности компаньона не принимает другие запросы проверки подлинности, если текущий отправленный не проходит проверку подлинности. Приложение устройства-компаньона Windows Hello должно оставаться настроенным до достижения следующего состояния.
CredentialAuthenticated Это означает, что отправленные учетные данные работали. CredentialAuthenticated имеет идентификатор устройства компаньона Windows Hello, которое успешно выполнено. Приложение устройства-компаньона Windows Hello должно убедиться в том, что оно было победителем. Если нет, приложение устройства-компаньона Windows Hello не должно отображать потоки после проверки подлинности (например, сообщение об успешном выполнении на устройстве-компаньоне или, возможно, вибрация на этом устройстве). Обратите внимание, что если отправленные учетные данные не работали, состояние изменится на состояние CollectingCredential.
ОстановкаAuthentication Проверка подлинности прошла успешно, и пользователь увидел рабочий стол. Время, чтобы убить фоновую задачу. Перед выходом из фоновой задачи явно отмените регистрацию обработчика StageEvent. Это поможет быстро завершить фоновую задачу.

Приложения устройства-компаньона Windows Hello должны вызывать только два API проверки подлинности в первых двух состояниях. Приложения устройства-компаньона Windows Hello должны проверить, какой сценарий запускается это событие. Существует две возможности: разблокировка или после разблокировки. В настоящее время поддерживается только разблокировка. В предстоящих выпусках могут поддерживаться сценарии разблокировки после разблокировки. Перечисление SecondaryAuthenticationFactorAuthenticationScenario фиксирует эти два варианта:

{
	SignIn = 0,      	// Running under lock screen mode
	CredentialPrompt, 	// Running post unlock
}

Полный пример кода:

using System;
using Windows.Security.Authentication.Identity.Provider;
using Windows.Storage.Streams;
using Windows.Security.Cryptography;
using System.Threading;
using Windows.ApplicationModel.Background;

namespace SecondaryAuthFactorSample
{
	public sealed class AuthenticationTask : IBackgroundTask
	{
		private string _deviceId;
		private static AutoResetEvent _exitTaskEvent = new AutoResetEvent(false);
		private static IBackgroundTaskInstance _taskInstance;
		private BackgroundTaskDeferral _deferral;

		private void Authenticate()
		{
			int retryCount = 0;

			while (retryCount < 3)
			{
				//
				// Pseudo code, the svcAuthNonce should be passed to device or generated from device
				//
				IBuffer svcAuthNonce = CryptographicBuffer.GenerateRandom(256/8);

				SecondaryAuthenticationFactorAuthenticationResult authResult = await
					SecondaryAuthenticationFactorAuthentication.StartAuthenticationAsync(
						_deviceId,
						svcAuthNonce);
				if (authResult.Status != SecondaryAuthenticationFactorAuthenticationStatus.Started)
				{
					SecondaryAuthenticationFactorAuthenticationMessage message;
					switch (authResult.Status)
					{
						case SecondaryAuthenticationFactorAuthenticationStatus.DisabledByPolicy:
							message = SecondaryAuthenticationFactorAuthenticationMessage.DisabledByPolicy;
							break;
						case SecondaryAuthenticationFactorAuthenticationStatus.InvalidAuthenticationStage:
							// The task might need to wait for a SecondaryAuthenticationFactorAuthenticationStageChangedEvent
							break;
						default:
							return;
					}

					// Show error message. Limited to 512 characters wide
					await SecondaryAuthenticationFactorAuthentication.ShowNotificationMessageAsync(null, message);
					return;
				}

				//
				// Pseudo function:
				// The device calculates and returns sessionHmac and deviceHmac
				//
				await GetHmacsFromDevice(
					authResult.Authentication.ServiceAuthenticationHmac,
					authResult.Authentication.DeviceNonce,
					authResult.Authentication.SessionNonce,
					out deviceHmac,
					out sessionHmac);
				if (sessionHmac == null ||
					deviceHmac == null)
				{
					await authResult.Authentication.AbortAuthenticationAsync(
						"Failed to read data from device");
					return;
				}

				SecondaryAuthenticationFactorFinishAuthenticationStatus status =
					await authResult.Authentication.FinishAuthencationAsync(deviceHmac, sessionHmac);
				if (status == SecondaryAuthenticationFactorFinishAuthenticationStatus.NonceExpired)
				{
					retryCount++;
					continue;
				}
				else if (status == SecondaryAuthenticationFactorFinishAuthenticationStatus.Completed)
				{
					// The credential data is collected and ready for unlock
					return;
				}
			}
		}

		public void OnAuthenticationStageChanged(
			object sender,
			SecondaryAuthenticationFactorAuthenticationStageChangedEventArgs args)
		{
			// The application should check the args.StageInfo.Stage to determine what to do in next. Note that args.StageInfo.Scenario will have the scenario information (SignIn vs CredentialPrompt).

			switch(args.StageInfo.Stage)
			{
			case SecondaryAuthenticationFactorAuthenticationStage.WaitingForUserConfirmation:
				// Show welcome message
				await SecondaryAuthenticationFactorAuthentication.ShowNotificationMessageAsync(
					null,
					SecondaryAuthenticationFactorAuthenticationMessage.WelcomeMessageSwipeUp);
				break;

			case SecondaryAuthenticationFactorAuthenticationStage.CollectingCredential:
				// Authenticate device
				Authenticate();
				break;

			case SecondaryAuthenticationFactorAuthenticationStage.CredentialAuthenticated:
				if (args.StageInfo.DeviceId = _deviceId)
				{
					// Show notification on device about PC unlock
				}
				break;

			case SecondaryAuthenticationFactorAuthenticationStage.StoppingAuthentication:
				// Quit from background task
				_exitTaskEvent.Set();
				break;
			}

			Debug.WriteLine("Authentication Stage = " + args.StageInfo.AuthenticationStage.ToString());
		}

		//
		// The Run method is the entry point of a background task.
		//
		public void Run(IBackgroundTaskInstance taskInstance)
		{
			_taskInstance = taskInstance;
			_deferral = taskInstance.GetDeferral();

			// Register canceled event for this task
			taskInstance.Canceled += TaskInstanceCanceled;

			// Find all device registered by this application
			IReadOnlyList<SecondaryAuthenticationFactorInfo> deviceInfoList =
				await SecondaryAuthenticationFactorRegistration.FindAllRegisteredDeviceInfoAsync(
					SecondaryAuthenticationFactorDeviceFindScope.AllUsers);

			if (deviceInfoList.Count == 0)
			{
				// Quit the task silently
				return;
			}
			_deviceId = deviceInfoList[0].DeviceId;
			Debug.WriteLine("Use first device '" + _deviceId + "' in the list to signin");

			// Register AuthenticationStageChanged event
			SecondaryAuthenticationFactorRegistration.AuthenticationStageChanged += OnAuthenticationStageChanged;

			// Wait the task exit event
			_exitTaskEvent.WaitOne();

			_deferral.Complete();
		}

		void TaskInstanceCanceled(IBackgroundTaskInstance sender, BackgroundTaskCancellationReason reason)
		{
			_exitTaskEvent.Set();
		}
	}
}

Регистрация фоновой задачи

Когда приложение устройства-компаньона Windows Hello регистрирует первое устройство-компаньона, оно также должно зарегистрировать его компонент фоновой задачи, который будет передавать сведения о проверке подлинности между устройством и службой проверки подлинности устройства-компаньона.

using System;
using Windows.Security.Authentication.Identity.Provider;
using Windows.Storage.Streams;
using Windows.ApplicationModel.Background;

namespace SecondaryAuthFactorSample
{
	public class BackgroundTaskManager
	{
		// Register background task
		public static async Task<IBackgroundTaskRegistration> GetOrRegisterBackgroundTaskAsync(
			string bgTaskName,
			string taskEntryPoint)
		{
			// Check if there's an existing background task already registered
			var bgTask = (from t in BackgroundTaskRegistration.AllTasks
						  where t.Value.Name.Equals(bgTaskName)
						  select t.Value).SingleOrDefault();
			if (bgTask == null)
			{
				BackgroundAccessStatus status =
					BackgroundExecutionManager.RequestAccessAsync().AsTask().GetAwaiter().GetResult();

				if (status == BackgroundAccessStatus.Denied)
				{
					Debug.WriteLine("Background Execution is denied.");
					return null;
				}

				var taskBuilder = new BackgroundTaskBuilder();
				taskBuilder.Name = bgTaskName;
				taskBuilder.TaskEntryPoint = taskEntryPoint;
				taskBuilder.SetTrigger(new SecondaryAuthenticationFactorAuthenticationTrigger());
				bgTask = taskBuilder.Register();
				// Background task is registered
			}

			bgTask.Completed += BgTask_Completed;
			bgTask.Progress += BgTask_Progress;

			return bgTask;
		}
	}
}

Ошибки и сообщения

Платформа устройства-компаньона Windows Hello отвечает за предоставление отзывов пользователю об успешном входе или сбое входа. Платформа устройства-компаньона Windows Hello предоставит сток (локализованные) текстовые сообщения и сообщения об ошибках для приложения-компаньона Windows Hello, чтобы выбрать один из вариантов. Они будут отображаться в пользовательском интерфейсе входа.

Ошибка устройства-компаньона

Приложения устройства-компаньон Windows Hello могут использовать ShowNotificationMessageAsync для отображения сообщений пользователю в рамках пользовательского интерфейса входа. Вызовите этот API, когда сигнал намерения доступен. Обратите внимание, что сигнал намерения всегда должен собираться на стороне устройства-компаньона Windows Hello.

Существует два типа сообщений: руководство и ошибки.

Сообщения руководства предназначены для того, чтобы показать пользователю, как запустить процесс разблокировки. Эти сообщения отображаются только пользователю один раз на экране блокировки при первой регистрации устройства и никогда не отображаются там снова. Эти сообщения будут отображаться на экране блокировки.

Сообщения об ошибках всегда отображаются и будут отображаться после предоставления сигнала намерения. Учитывая, что перед отображением сообщений пользователю необходимо собрать сигнал намерения, и пользователь предоставит это намерение только с помощью одного из устройств-компаньонов Windows Hello, не должно быть ситуации, когда несколько устройств-компаньонов Windows Hello для отображения сообщений об ошибках. В результате платформа устройства-компаньона Windows Hello не поддерживает очередь. Когда вызывающий запрашивает сообщение об ошибке, он будет отображаться в течение 5 секунд, а все остальные запросы на отображение сообщения об ошибке в течение 5 секунд удаляются. Через 5 секунд возникает возможность для другого вызывающего объекта, чтобы отобразить сообщение об ошибке. Мы запрещаем вызову канала ошибок.

Инструкции и сообщения об ошибках приведены ниже. Имя устройства — это параметр, переданный приложением устройства-компаньона в рамках ShowNotificationMessageAsync.

Руководство

  • "Проводите пальцем вверх или нажимайте пробел, чтобы войти с помощью имени устройства".
  • "Настройка устройства-компаньона. Подождите или используйте другой вариант входа".
  • "Коснитесь имени устройства для средства чтения NFC для входа".
  • "Ищете имя устройства ..."
  • "Подключите имя устройства к USB-порту для входа".

ошибки

  • "См. имя устройства для инструкций по входу".
  • "Включите Bluetooth, чтобы использовать имя устройства для входа".
  • "Включите NFC, чтобы использовать имя устройства для входа".
  • "Подключение к сети Wi-Fi для использования имени устройства для входа".
  • "Снова коснитесь имени устройства".
  • "Ваше предприятие запрещает вход с помощью имени устройства. Используйте другой вариант входа.
  • "Коснитесь имени устройства для входа".
  • "Наведите пальцем на имя устройства, чтобы войти".
  • "Проводите пальцем по имени устройства, чтобы войти".
  • "Не удалось войти с именем устройства. Используйте другой вариант входа.
  • "Что-то пошло не так. Используйте еще один параметр входа, а затем снова настройте имя устройства".
  • "Повторите попытку".
  • "Скажи парольную фразу в имя устройства".
  • "Готово к входу с помощью имени устройства".
  • "Сначала используйте другой вариант входа, а затем можно использовать имя устройства для входа".

Перечисление зарегистрированных устройств

Приложение устройства-компаньона Windows Hello может перечислить список зарегистрированных устройств-компаньонов с помощью вызова FindAllRegisteredDeviceInfoAsync. Этот API поддерживает два типа запросов, определенных с помощью перечисления SecondaryAuthenticationFactorDeviceFindScope:

{
	User = 0,
	AllUsers,
}

Первая область возвращает список устройств для пользователя, вошедшего в систему. Второй возвращает список для всех пользователей на этом компьютере. Первая область должна использоваться во время отмены регистрации, чтобы избежать отмены регистрации устройства-компаньона Windows Hello другого пользователя. Второй должен использоваться во время проверки подлинности или регистрации: во время регистрации это перечисление может помочь приложению избежать попытки зарегистрировать одно и то же устройство-компаньон Windows Hello дважды.

Обратите внимание, что даже если приложение не выполняет эту проверку, компьютер отклонит одно и то же устройство-компаньон Windows Hello от регистрации более одного раза. Во время проверки подлинности, используя область AllUsers, приложение-компаньон Windows Hello поддерживает переключение пользовательского потока: вход пользователя A при входе пользователя B (это требует, чтобы оба пользователя установили приложение устройства-компаньона Windows Hello и пользователя A зарегистрировали свои сопутствующие устройства с компьютером и компьютер сидит на экране блокировки (или на экране входа)).

Требования к безопасности

Служба проверки подлинности компаньона предоставляет следующие средства защиты.

  • Вредоносные программы на классическом устройстве Windows 10, работающем в качестве среднего пользователя или контейнера приложений, не могут использовать устройство-компаньон Windows Hello для доступа к ключам учетных данных пользователя (хранящимся в Windows Hello) на компьютере автоматически.
  • Злоумышленник на классическом устройстве Windows 10 не может использовать устройство-компаньон Windows Hello, принадлежащее другому пользователю на классическом устройстве Windows 10, чтобы получить автоматический доступ к его ключам учетных данных пользователя (на том же классическом устройстве с Windows 10).
  • Вредоносные программы на устройстве компаньона Windows Hello не могут автоматически получать доступ к ключам учетных данных пользователя на классическом устройстве с Windows 10, включая использование функциональных возможностей или кода, разработанных специально для платформы устройств-компаньонов Windows Hello.
  • Злоумышленник не может разблокировать классическое устройство с Windows 10, захватив трафик между устройством-компаньоном Windows Hello и настольным устройством Windows 10 и повторив его позже. Использование nonce, authkey и HMAC в нашем протоколе гарантирует защиту от атаки воспроизведения.
  • Вредоносные программы или злонамеренные пользователи на компьютере-компаньоне Windows Hello не могут использовать устройство-компаньон Windows Hello, чтобы получить доступ к честному компьютеру пользователя. Это достигается путем взаимной проверки подлинности между службой проверки подлинности компаньона и устройством-компаньоном Windows Hello с помощью authkey и HMAC в нашем протоколе.

Ключом для обеспечения защиты безопасности, перечисленных выше, является защита ключей HMAC от несанкционированного доступа, а также проверка присутствия пользователей. В частности, он должен соответствовать этим требованиям:

  • Защита от клонирования устройства-компаньона Windows Hello
  • Защита от перехвата при отправке ключей HMAC во время регистрации на компьютер
  • Убедитесь, что сигнал присутствия пользователя доступен