Windows Hello 도우미(IoT) 디바이스에서 Windows 잠금 해제

Windows Hello 도우미 디바이스는 사용자 인증 환경을 향상하기 위해 Windows 10 데스크톱과 함께 실행할 수 있습니다. Windows Hello 도우미 디바이스 프레임워크를 사용하면, 도우미 디바이스는 생체 인식을 사용할 수 없는 경우(예시: Windows 10 데스크톱에 얼굴 인증용 카메라 또는 지문 판독기를 사용할 수 없는 경우)에도 Windows Hello에 풍부한 환경을 제공할 수 있습니다.

참고 항목

Windows 10 버전 2004에서 Windows Hello 도우미 디바이스 프레임워크용 API는 더 이상 사용되지 않습니다.

소개

코드 샘플은 Windows Hello 도우미 디바이스 프레임워크 Github 리포지토리를 참조하세요.

사용 사례

여러 가지 방법으로 Windows Hello 도우미 디바이스 프레임워크를 사용하여 도우미 디바이스로 멋진 Windows 잠금 해제 환경을 빌드할 수 있습니다. 예를 들어, 사용자는 다음을 할 수 있습니다.

  • USB를 통해 도우미 디바이스를 PC에 연결하고, 도우미 디바이스의 버튼을 터치하고, PC의 잠금을 자동으로 해제합니다.
  • 이미 Bluetooth를 통해 PC와 페어링 된 휴대 전화를 주머니에 휴대합니다. PC에서 스페이스바를 누르면 휴대폰이 알림을 받습니다. 승인하면 PC가 잠금 해제됩니다.
  • NFC reader에서 도우미 디바이스를 탭하여 PC의 잠금을 빠르게 해제합니다.
  • 이미 착용자를 인증한 피트니스 밴드를 착용합니다. PC에 접근하고 특별한 제스처(박수 등)를 수행하면 PC가 잠금 해제됩니다.

생체 인식이 사용 설정된 Windows Hello 도우미 디바이스

도우미 디바이스가 생체 인식을 지원하는 경우, Windows Hello 도우미 디바이스 프레임워크보다 Windows 생체 인식 프레임워크가 더 나은 솔루션일 수도 있습니다.

솔루션의 구성 요소

아래의 다이어그램은 솔루션의 구성 요소와 솔루션 빌드를 담당하는 사용자를 보여 줍니다.

프레임워크 개요

Windows Hello 도우미 디바이스 프레임워크는 Windows에서 실행되는 서비스로 구현됩니다(이 문서의 도우미 인증 서비스라고 함). 이 서비스는 Windows Hello 도우미 디바이스에 저장된 HMAC 키로 보호해야 하는 잠금 해제 토큰을 생성합니다. 이렇게 하면 잠금 해제 토큰에 액세스하기 위해 Windows Hello 도우미 디바이스가 있어야 합니다. 각(PC, Windows 사용자) 튜플마다 고유한 잠금 해제 토큰이 있습니다.

Windows Hello 도우미 디바이스 프레임워크와 통합하려면 다음의 사항이 필요합니다.

  • Windows 앱 스토어에서 다운로드한 도우미 디바이스에 대한 Universal Windows Platform(UWP) Windows Hello 도우미 디바이스 앱입니다.
  • Windows Hello 도우미 디바이스에서 두 개의 256비트 HMAC 키를 만들고, 이를 사용하여 HMAC를 생성하는 기능(SHA-256 사용)입니다.
  • Windows 10 데스크톱의 보안 설정이 올바르게 구성되었습니다. 도우미 인증 서비스는 Windows Hello 도우미 디바이스를 연결하기 전에 이 PIN을 설정해야 합니다. 사용자는 설정 > 계정 > 로그인 옵션을 통해 PIN을 설정해야 합니다.

위의 요구 사항 외에도 Windows Hello 도우미 디바이스 앱은 다음의 사항을 담당합니다.

  • Windows Hello 도우미 디바이스의 초기 등록 및 이후 등록 취소에 대한 사용자 환경 및 브랜딩입니다.
  • 백그라운드에서 실행, Windows Hello 도우미 디바이스 검색, Windows Hello 도우미 디바이스 및 도우미 인증 서비스와 통신입니다.
  • 오류 처리

일반적으로 도우미 장치는 피트니스 밴드를 처음으로 설정하는 것과 같은 초기 설정을 위한 앱과 함께 제공됩니다. 이 문서에 설명된 기능은 해당 앱의 일부일 수 있으며, 별도의 앱이 필요하지 않아야 합니다.

사용자 신호

각 Windows Hello 도우미 디바이스는 세 개의 사용자 신호를 지원하는 앱과 결합되어야 합니다. 이러한 신호는 동작 또는 제스처의 형태일 수 있습니다.

  • 의도 신호: 예를 들어 Windows Hello 도우미 디바이스에서 버튼을 눌러 잠금 해제에 대한 의도를 표시할 수 있습니다. 의도 신호는 Windows Hello 도우미 디바이스 쪽에서 수집해야 합니다.
  • 사용자 현재 상태 신호: 사용자의 현재 상태를 증명합니다. 예를 들어, Windows Hello 도우미 디바이스를 PC 잠금 해제에 사용하려면 PIN이 필요하거나(PC PIN과 혼동하지 않음) 버튼을 눌러야 할 수 있습니다.
  • 명확성 신호: Windows Hello 도우미 디바이스에서 여러 옵션을 사용할 수 있을 때, 사용자가 잠금을 해제하려는 Windows 10 데스크톱을 명확하게 표시합니다.

이러한 사용자 신호의 개수는 하나로 결합할 수 있습니다. 사용자 현재 상태 및 의도 신호는 사용 시 매번 필요합니다.

PC와 Windows Hello 도우미 디바이스 간의 등록 및 향후 통신

Windows Hello 도우미 디바이스 프레임워크에 Windows Hello 도우미 디바이스를 연결하려면 프레임워크에 등록해야 합니다. Windows Hello 도우미 디바이스 앱은 등록 환경을 완전히 소유합니다.

Windows Hello 도우미 디바이스 및 Windows 10 데스크톱 디바이스 간의 관계는 일 대 다일 수 있습니다(즉, 여러 Windows 10 데스크톱 디바이스에 하나의 도우미 디바이스를 사용할 수 있음). 그러나 각 Windows Hello 도우미 디바이스는 각 Windows 10 데스크톱 디바이스의 한 사용자에 대해서만 사용할 수 있습니다.

Windows Hello 도우미 디바이스가 PC와 통신하기 전에 사용할 전송에 동의해야 합니다. 이러한 선택은 Windows Hello 도우미 디바이스 앱에 맡기고, Windows Hello 도우미 디바이스 프레임워크는 Windows Hello 도우미 디바이스와 Windows 10 데스크톱 디바이스 쪽의 Windows Hello 도우미 디바이스 앱 간에 사용되는 전송 유형(USB, NFC, WiFi, BT, BLE 등) 또는 프로토콜에 제한을 두지 않습니다. 그러나 이 문서의 "보안 요구 사항" 섹션에 설명된 대로, 전송 계층에 대한 특정 보안 고려 사항을 제안합니다. 디바이스 공급자는 이러한 요구 사항을 제공할 책임을 가집니다. 프레임워크는 이를 제공하지 않습니다.

사용자 조작 모델

Windows Hello 도우미 디바이스 앱 검색, 설치 및 처음 등록

일반적인 사용자 워크플로는 다음과 같습니다.

  • 사용자는 잠금을 해제하려는 각 대상 Windows 10 데스크톱 디바이스에서 PIN을 설정하기 위해 해당 Windows Hello 도우미 디바이스를 사용합니다.
  • 사용자는 Windows 10 데스크톱에 Windows Hello 도우미 디바이스를 등록하기 위해 Windows 10 데스크톱 디바이스에서 Windows Hello 도우미 디바이스 앱을 실행합니다.

참고:

  • Windows Hello 도우미 디바이스 앱의 검색, 다운로드 및 시작을 간소화하고, 가능하면 자동화하는 것이 좋습니다(예시: Windows 10 데스크톱 디바이스 쪽에서 NFC 리더에 Windows Hello 도우미 디바이스 앱을 탭하면 앱을 다운로드할 수 있음). 그러나 이는 Windows Hello 도우미 디바이스 및 Windows Hello 도우미 디바이스 앱의 책임입니다.
  • 엔터프라이즈 환경에서 MDM을 통해 Windows Hello 도우미 디바이스 앱을 배포할 수 있습니다.
  • Windows Hello 도우미 디바이스 앱은 등록의 일부로 발생하는 오류 메시지를 사용자에게 표시해야 합니다.

등록 및 등록 취소 프로토콜

다음의 다이어그램에서는 등록하는 동안 Windows Hello 도우미 디바이스가 도우미 인증 서비스와 상호 작용하는 방법을 보여 줍니다.

등록 흐름 다이어그램

프로토콜에는 다음의 두 가지 키가 사용됩니다.

  • 디바이스 키(devicekey): PC에서 Windows 잠금을 해제하는 데 필요한 잠금 해제 토큰을 보호하는 데 사용됩니다.
  • 인증 키(인증 키): Windows Hello 도우미 디바이스 및 도우미 인증 서비스를 상호 인증하는 데 사용됩니다.

디바이스 키 및 인증 키는 등록 시 Windows Hello 도우미 디바이스 앱과 Windows Hello 도우미 디바이스 간에 교환됩니다. 그러모르 Windows Hello 도우미 디바이스 앱 및 Windows Hello 도우미 디바이스는 보안 전송을 사용하여 키를 보호해야 합니다.

또한 위의 다이어그램에는 Windows Hello 도우미 디바이스에서 생성되는 두 개의 HMAC 키가 표시되지만, 앱에서 이를 생성하고 스토리지를 위해 Windows Hello 도우미 디바이스로 보낼 수도 있습니다.

인증 흐름 시작하기

사용자가 Windows Hello 도우미 디바이스 프레임워크(예시: 의도 신호 제공)를 사용하여 Windows 10 데스크톱에 로그인 흐름을 시작하기 위한 두 가지 방법은 다음과 같습니다.

  • 노트북에서 덮개를 열거나 스페이스바를 누르거나 PC에서 위로 살짝 밉니다.
  • 제스처 또는 작업을 Windows Hello 도우미 장치 쪽에서 수행합니다.

Windows Hello 도우미 디바이스에서 시작 지점 중 하나를 선택하여 고릅니다. Windows Hello 도우미 디바이스 프레임워크는 옵션 1이 발생하면 도우미 디바이스 앱에 알립니다. 옵션 2의 경우, Windows Hello 도우미 디바이스 앱은 도우미 디바이스를 쿼리하여 해당 이벤트가 캡처되었는지 확인해야 합니다. 이렇게 하면 Windows Hello 도우미 디바이스가 의도 신호를 잠금 해제가 성공하기 전에 수집할 수 있습니다.

Windows Hello 도우미 디바이스 자격 증명 공급자

Windows 10에는 모든 Windows Hello 도우미 디바이스를 처리하는 새 자격 증명 공급자가 있습니다.

Windows Hello 도우미 디바이스 자격 증명 공급자는 도우미 디바이스 백그라운드 작업을 시작하기 위해 트리거를 활성화합니다. 트리거는 PC가 깨어나고 잠금 화면이 표시될 때 처음으로 설정됩니다. 두 번째로 설정되는 경우는 PC가 로그온 UI를 입력하고 Windows Hello 도우미 디바이스 자격 증명 공급자가 선택된 타일인 경우입니다.

Windows Hello 도우미 장치 앱에 대한 도우미 라이브러리는 잠금 화면을 수신 대기하고 변경 상태 Windows Hello 도우미 디바이스 백그라운드 작업에 해당하는 이벤트를 보냅니다.

Windows Hello 도우미 디바이스 백그라운드 작업이 여러 개 있는 경우, 인증 프로세스를 완료한 첫 번째 백그라운드 작업이 PC의 잠금을 해제합니다. 도우미 디바이스 인증 서비스는 남아있는 모든 인증 호출을 무시합니다.

Windows Hello 도우미 디바이스 앱에서 Windows Hello 도우미 디바이스 쪽의 환경을 소유하고 관리합니다. Windows Hello 도우미 디바이스 프레임워크는 사용자 환경의 이 부분을 제어할 수 없습니다. 보다 구체적으로, 도우미 인증 공급자는 해당 백그라운드 앱을 통해 Windows Hello 도우미 디바이스 앱에 로그온 UI의 상태 변경(예시: 잠금 화면이 방금 해제됨 또는 사용자가 스페이스바를 눌러 잠금 화면을 방금 해제함)을 알리며, Windows Hello 도우미 디바이스 앱에는 이를 중심으로 환경을 작성해야 하는 책임이 있습니다(예시: 사용자가 스페이스바를 눌러 잠금 화면을 해제하면 USB를 통해 디바이스를 찾기 시작함).

Windows Hello 도우미 디바이스 프레임워크는 Windows Hello 도우미 디바이스 앱에서 선택할 수 있는 (지역화된) 텍스트 및 오류 메시지를 제공합니다. 이는 잠금 화면 위(또는 로그온 UI)에 표시됩니다. 자세한 정보를 보려면 메시지 및 오류 처리하기 섹션을 참조하세요.

인증 프로토콜

Windows Hello 도우미 디바이스 앱과 연결된 백그라운드 작업이 트리거되면, Windows Hello 도우미 디바이스에 요청하여 도우미 인증 서비스에서 계산한 HMAC 값의 유효성을 검사하고 두 개의 HMAC 값을 계산하도록 합니다.

  • 서비스 HMAC 유효성 검사 = HMAC(인증 키, 서비스 nonce || 디바이스 nonce || 세션 nonce).
  • 디바이스 키의 HMAC를 nonce를 사용하여 계산합니다.
  • 인증 키의 HMAC를 도우미 인증 서비스에서 생성된 nonce 및 연결된 첫 번째 HMAC 값을 사용하여 계산합니다.

두 번째 계산 값은 서비스에서 디바이스를 인증하고 전송 채널에서 재생 공격을 방지하는 데 사용됩니다.

업데이트된 등록 흐름 다이어그램.

수명 주기 관리

한 번 등록하고, 어디서나 사용하세요

백 엔드 서버가 없으면, 사용자는 Windows Hello 도우미 디바이스를 각 Windows 10 데스크톱 디바이스에 별도로 등록해야 합니다.

도우미 디바이스 공급업체 또는 OEM은 사용자 Windows 10 데스크톱 또는 모바일 디바이스에서 등록 상태를 로밍하는 웹 서비스를 구현할 수 있습니다. 자세한 정보를 보려면 로밍, 해지 및 필터 서비스 섹션을 참조하세요.

PIN 관리

도우미 디바이스를 사용하려면, Windows 10 데스크톱 디바이스에서 PIN을 설정해야 합니다. 이렇게 하면 Windows Hello 도우미 디바이스가 작동하지 않는 경우, 사용자가 백업을 사용할 수 있습니다. PIN은 Windows에서 관리하고 앱이 볼 수 없는 항목입니다. 사용자가 변경하려면 설정 > 계정 > 로그인 옵션으로 이동합니다.

관리 및 정책

사용자는 해당 데스크톱 디바이스에서 Windows Hello 도우미 디바이스 앱을 실행하여 Windows 10 데스크톱에서 Windows Hello 도우미 디바이스를 제거할 수 있습니다.

엔터프라이즈에는 Windows Hello 도우미 디바이스 프레임워크를 제어하는 두 가지 옵션이 있습니다.

  • 기능을 켜거나 끄기
  • Windows AppLocker를 사용하여 허용되는 Windows Hello 도우미 디바이스의 허용 목록 정의하기

Windows Hello 도우미 디바이스 프레임워크는 사용 가능한 도우미 디바이스의 인벤토리를 유지하는 중앙 집중식 방법 또는 허용되는 Windows Hello 도우미 디바이스 형식의 인스턴스를 추가로 필터링하는 방법을 지원하지 않습니다(예시: X와 Y 사이에 일련 번호가 있는 도우미 디바이스만 허용됨). 그러나 앱 개발자는 이러한 기능을 제공하는 서비스를 빌드할 수 있습니다. 자세한 정보를 보려면 로밍, 해지 및 필터 서비스 섹션을 참조하세요.

취소

Windows Hello 도우미 디바이스 프레임워크는 특정 Windows 10 데스크톱 디바이스에서 원격으로 도우미 디바이스를 제거하는 것을 지원하지 않습니다. 대신 사용자는 Windows Hello 도우미 디바이스를 제거하기 위해 해당 Windows 10 데스크톱에서 실행되는 Windows Hello 도우미 장치 앱을 사용할 수 있습니다.

그러나 도우미 디바이스 공급업체는 원격 해지 기능을 제공하는 서비스를 빌드할 수 있습니다. 자세한 정보를 보려면 로밍, 해지 및 필터 서비스 섹션을 참조하세요.

로밍 및 필터 서비스

도우미 디바이스 공급업체는 다음과 같은 시나리오에 사용할 수 있는 웹 서비스를 구현할 수 있습니다.

  • 엔터프라이즈용 필터 서비스: 엔터프라이즈는 해당 환경에서 작동할 수 있는 Windows Hello 도우미 디바이스 집합을 특정 공급업체의 일부 디바이스로 제한할 수 있습니다. 예를 들어, Contoso는 공급업체 X에서 10,000개의 Model Y 도우미 디바이스를 주문하고 해당 디바이스만 Contoso do기본에서 작동하도록 할 수 있습니다(공급업체 X의 다른 디바이스 모델은 아님).
  • 인벤토리: 엔터프라이즈는 엔터프라이즈 환경에서 사용되는 기존 도우미 디바이스 목록을 확인할 수 있습니다.
  • 실시간 해지: 직원이 도우미 디바이스를 분실하거나 도난당했다고 보고하는 경우, 웹 서비스를 사용하여 해당 디바이스를 해지할 수 있습니다.
  • 로밍: 사용자는 도우미 디바이스를 한 번만 등록하면 되며, 이는 모든 Windows 10 데스크톱 및 모바일에서 작동합니다.

이러한 기능을 구현하려면 Windows Hello 도우미 디바이스 앱이 등록 및 사용 시간에 웹 서비스와 검사해야 합니다. Windows Hello 도우미 디바이스 앱은 하루에 한 번만 웹 서비스로 검사 요구(해지 시간을 최대 1일로 연장하는 비용으로)와 같은 캐시된 로그온 시나리오에 최적화할 수 있습니다.

Windows Hello 도우미 디바이스 프레임워크 API 모델

개요

Windows Hello 도우미 디바이스 앱에는 디바이스 등록 및 등록 취소를 담당하는 UI가 있는 예리한 앱과 인증을 처리하는 백그라운드 작업이라는 두 가지 구성 요소가 포함되어야 합니다.

전체 API 흐름은 다음과 같습니다.

  1. Windows Hello 도우미 디바이스 등록하기
    • 디바이스가 근처에 있는지 확인하고 해당 기능을 쿼리합니다(필요한 경우).
    • 두 개의 HMAC 키 생성하기(도우미 디바이스 쪽 또는 앱 쪽)
    • RequestStartRegisteringDeviceAsync 호출하기
    • FinishRegisteringDeviceAsync 호출하기
    • Windows Hello 도우미 디바이스 앱이 HMAC 키(지원되는 경우)를 저장하고 Windows Hello 도우미 디바이스 앱이 해당 앱의 복사본을 삭제했는지 확인합니다.
  2. 백그라운드 작업 등록하기
  3. 백그라운드 작업에서 올바른 이벤트 기다리기
    • WaitingForUserConfirmation: 인증 흐름을 시작하기 위해 Windows Hello 도우미 디바이스 쪽의 사용자 작업/제스처가 필요한 경우, 이 이벤트를 기다리세요
    • CollectingCredential: Windows Hello 도우미 디바이스가 PC 쪽 사용자 작업/제스처(예시: 스페이스바 누르기)를 사용하여 인증 흐름을 시작하는 경우, 이 이벤트를 기다리세요
    • 스마트 카드 등의 다른 트리거: 현재 인증 상태를 쿼리하여 올바른 API를 호출해야 합니다.
  4. 오류 메시지 또는 필요한 다음 단계에 대한 정보를 사용자에게 유지하기 위해 ShowNotificationMessageAsync를 호출합니다. 의도 신호가 수집된 후에만 이 API를 호출합니다.
  5. 잠금 해제
    • 의도 및 사용자 현재 상태 신호가 수집되었는지 확인하세요
    • StartAuthenticationAsync 호출하기
    • 필요한 HMAC 작업을 도우미 디바이스와 통신하여 수행하세요
    • FinishAuthenticationAsync 호출하기
  6. 사용자가 요청할 때 Windows Hello 도우미 디바이스 등록 취소하기(예시: 도우미 디바이스를 분실한 경우)
    • FindAllRegisteredDeviceInfoAsync를 통해 로그인한 사용자에 대한 Windows Hello 도우미 디바이스 열거하기
    • 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)에서 사용하는 핸들을 반환합니다. 등록에 대한 첫 번째 호출은 사용자가 있는지 확인하기 위해 PIN 프롬프트를 시작합니다. PIN이 설정되지 않은 경우, 이 호출은 실패합니다. Windows Hello 도우미 디바이스 앱은 KEYCredentialManager.IsSupportedAsync 호출을 통해 PIN이 설정되었는지 여부를 쿼리할 수 있습니다. 정책이 Windows Hello 도우미 디바이스의 사용을 사용하지 않도록 설정한 경우에도 RequestStartRegisteringDeviceAsync 호출이 실패할 수 있습니다.

첫 번째 호출의 결과는 다음과 같은 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 도우미 디바이스 앱에서 사용할 수 있습니다. 예를 들어 이 데이터를 사용하여 MAC 주소와 같은 Windows Hello 도우미 디바이스에 연결하거나 Windows Hello 도우미 디바이스에 스토리지가 없거나 도우미 디바이스가 스토리지에 PC를 사용하려는 경우 구성 데이터를 사용할 수 있습니다. 구성 데이터의 일부로 저장된 중요한 데이터는 Windows Hello 도우미 디바이스만 알고 있는 키로 암호화해야 합니다. 또한 구성 데이터가 Windows 서비스에 의해 저장되는 경우, 사용자 프로필에서 Windows Hello 도우미 디바이스 앱에서 사용할 수 있습니다.

Windows Hello 도우미 디바이스 앱은 AbortRegisteringDeviceAsync를 호출하여 등록을 취소하고 오류 코드를 전달할 수 있습니다. 도우미 인증 서비스는 오류를 원격 분석 데이터에 기록합니다. 이 호출의 좋은 예시는 Windows Hello 도우미 디바이스에서 문제가 발생하여 등록을 완료할 수 없는 경우입니다(예시: HMAC 키를 저장할 수 없거나 BT 연결이 끊어진 경우).

Windows Hello 도우미 디바이스 앱은 Windows 10 데스크톱에서 Windows Hello 도우미 디바이스 등록을 취소하는 옵션을 사용자에게 제공해야 합니다(예시: 도우미 디바이스를 분실했거나 최신 버전을 구입한 경우). 사용자가 해당 옵션을 선택하면 Windows Hello 도우미 디바이스 앱이 UnregisterDeviceAsync를 호출해야 합니다. Windows Hello 도우미 디바이스 앱의 이 호출은 도우미 디바이스 인증 서비스를 트리거하여 PC 쪽에서 호출자 앱의 특정 디바이스 ID 및 AppId에 해당하는 모든 데이터(HMAC 키 포함)를 삭제합니다. 이 API 호출은 Windows Hello 도우미 디바이스 앱 또는 도우미 디바이스 쪽에서 HMAC 키를 삭제하려고 시도하지 않습니다. 이는 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에서 사용하는 핸들을 반환합니다. 무엇보다도 첫 번째 호출은 (다른 항목과 연결되면) Windows Hello 도우미 디바이스에 저장된 디바이스 키와 HMAC'ed여야 하는 nonce를 반환합니다. 두 번째 호출은 디바이스 키를 사용하여 HMAC의 결과를 반환하며 인증에 성공하면 종료될 수 있습니다(즉, 사용자에게 데스크톱이 표시됨).

정책이 초기 등록 뒤에 Windows Hello 도우미 디바이스를 사용하지 않도록 설정한 경우, 첫 번째 시작 API(StartAuthenticationAsync)는 실패할 수 있습니다. 또한 API 호출이 WaitingForUserConfirmation 또는 CollectingCredential 상태 외부에서 수행된 경우에도 실패할 수 있습니다(이 섹션의 뒷부분에서 자세히 설명). 이는 등록되지 않은 도우미 디바이스 앱이 호출하는 경우에도 실패할 수 있습니다. SecondaryAuthenticationFactorAuthenticationStatus 열거형은 가능한 결과를 다음과 같이 요약합니다.

{
	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)은 첫 번째 호출에 제공된 nonce가 만료되면(20초) 실패할 수 있습니다. SecondaryAuthenticationFactorFinishAuthenticationStatus 열거형은 가능한 결과를 캡처합니다.

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

두 API 호출(StartAuthenticationAsync 및 FinishAuthencationAsync)의 타이밍은 Windows Hello 도우미 디바이스가 의도, 사용자 현재 상태 및 명확성 신호를 수집하는 방법과 일치해야 합니다(세부 정보는 사용자 신호 참조). 예를 들어, 두 번째 호출은 의도 신호를 사용할 수 있을 때까지 제출되면 안 됩니다. 즉, PC의 잠금은 사용자가 의도를 표시하지 않은 경우에는 해제하면 안 됩니다. 이를 더 명확하게 하려면 Bluetooth 근접이 PC 잠금 해제에 사용된다고 가정하고, 그렇지 않으면 사용자가 부엌으로 가는 길에 PC를 따라 가자마자 명시적 의도 신호를 수집해야 합니다. 또한 첫 번째 호출에서 반환된 nonce는 시간 바인딩(20초)이며 특정 기간 후에 만료됩니다. 따라서 첫 번째 호출은 Windows Hello 도우미 디바이스 앱이 도우미 디바이스 현재 상태를 잘 나타내는 경우에만 수행해야 합니다(예시: 도우미 디바이스가 USB 포트에 삽입되거나 NFC 리더에 탭된 경우). Bluetooth를 사용하는 경우, PC 쪽의 배터리에 영향을 주거나 Windows Hello 도우미 장치 현재 상태를 검사할 때 해당 시점에 진행되는 다른 Bluetooth 활동에 영향을 주지 않도록 주의해야 합니다. 또한 사용자 현재 상태 신호를 제공해야 하는 경우(예시: PIN 입력), 해당 신호가 수집된 뒤에만 첫 번째 인증 호출을 수행하는 것이 좋습니다.

Windows Hello 도우미 디바이스 프레임워크는 Windows Hello 도우미 디바이스 앱이 사용자가 인증 흐름에 있는 위치를 완전히 파악하여 두 개 이상의 호출을 할 시기를 정보에 입각한 의사 결정을 내리는 데 도움이 됩니다. Windows Hello 도우미 디바이스 프레임워크는 이 기능을 제공하기 위해 앱 백그라운드 작업에 잠금 상태 변경 알림을 제공합니다.

도우미 디바이스 흐름

이러한 각 상태에 대한 자세한 내용은 다음과 같습니다.

상태 설명
WaitingForUserConfirmation 이 상태 변경 알림 이벤트는 잠금 화면이 해제된 경우(예시: 사용자가 Windows+L을 누른 경우)에 발생합니다. 이 상태에서 디바이스를 찾는 데 어려움이 있는 경우와 관련된 오류 메시지를 요청하지 않는 것이 권장됩니다. 일반적으로 의도 신호를 사용할 수 있는 경우에만 메시지를 표시하는 것이 권장됩니다. Windows Hello 도우미 디바이스 앱은 도우미 디바이스에서 의도 신호(예시: NFC 리더에 탭하기, 도우미 디바이스에서 단추 누르기 또는 박수와 같은 특정 제스처)를 수집하고 도우미 디바이스 앱 백그라운드 작업이 Windows Hello 도우미 디바이스에서 의도 신호가 검색되었다는 표시를 받은 경우에 이 상태의 인증에 대한 첫 번째 API 호출을 해야 합니다. 그렇지 않으면 Windows Hello 도우미 디바이스 앱이 PC를 사용하여 인증 흐름을 시작하는 경우(사용자가 잠금 해제 화면을 살짝 밀거나 스페이스바를 누르면), Windows Hello 도우미 디바이스 앱은 다음 상태(CollectingCredential)를 기다려야 합니다.
CollectingCredential 이 상태 변경 알림 이벤트는 사용자가 노트북 덮개를 열거나 키보드의 키를 적중하거나 잠금 해제 화면까지 살짝 밀면 발생합니다. Windows Hello 도우미 디바이스가 위의 작업을 사용하여 의도 신호 수집을 시작하는 경우, Windows Hello 도우미 디바이스 앱은 수집을 시작해야 합니다(예시: 사용자가 PC의 잠금을 해제하려는지 여부를 묻는 팝업을 도우미 디바이스에 표시). Windows Hello 도우미 디바이스 앱에서 사용자가 도우미 디바이스에 사용자 현재 상태 신호를 제공해야 하는 경우(예시: Windows Hello 도우미 디바이스에서 PIN 입력), 오류 사례를 제공하는 것이 좋습니다.
SuspendingAuthentication Windows Hello 도우미 디바이스 앱이 이 상태를 수신하면 도우미 인증 서비스가 인증 요청 수락을 중지했음을 의미합니다.
CredentialCollected 즉, 다른 Windows Hello 도우미 디바이스 앱이 두 번째 API를 호출했으며 도우미 인증 서비스에서 제출된 내용을 확인합니다. 현재, 도우미 인증 서비스는 제출된 인증이 확인을 통과하지 않는 한 다른 인증 요청을 수락하지 않습니다. Windows Hello 도우미 디바이스 앱은 다음 상태에 도달할 때까지 계속 지켜봐야 합니다.
CredentialAuthenticated 이는 제출된 자격 증명이 작동했음을 의미합니다. credentialAuthenticated에는 성공한 Windows Hello 도우미 디바이스의 디바이스 ID가 있습니다. Windows Hello 도우미 디바이스 앱은 연결된 디바이스가 승자인지 확인하기 위해 해당 디바이스에서 확인됩니다. 그렇지 않은 경우, Windows Hello 도우미 디바이스 앱은 사후 인증 흐름(예시: 도우미 디바이스의 성공 메시지 또는 해당 디바이스의 진동)을 표시하지 않아야 합니다. 제출된 자격 증명이 작동하지 않으면 상태가 CollectingCredential 상태로 변경된다는 것에 유의하세요.
StoppingAuthentication 인증에 성공했으며 사용자가 데스크톱을 확인했습니다. 백그라운드 작업 중단 시간입니다. 백그라운드 작업을 종료하기 전에 명시적으로 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 registred 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 도우미 디바이스 앱에서 선택할 수 있는 (지역화된) 텍스트 및 오류 메시지를 제공합니다. 이러한 사항은 로그온 UI에 표시됩니다.

도우미 디바이스 오류

Windows Hello 도우미 디바이스 앱은 ShowNotificationMessageAsync를 사용하여 로그온 UI의 일부로서 사용자에게 메시지를 표시할 수 있습니다. 의도 신호를 사용할 수 있는 경우, 이 API를 호출합니다. 의도 신호는 항상 Windows Hello 도우미 디바이스 쪽에서 수집되어야 한다는 점에 유의하세요.

메시지 형식으로는 지침 및 오류의 두 가지 형식이 있습니다.

지침 메시지는 사용자에게 잠금 해제 프로세스를 시작하는 방법을 표시하도록 설계되었습니다. 첫 번째 디바이스 등록 시 이러한 메시지기 잠금 화면에 한 번만 표시되며 다시 표시되지 않습니다. 이러한 메시지는 잠금 화면 아래에 계속 표시됩니다.

오류 메시지는 항상 표시되며, 의도 신호가 제공된 이후에도 표시됩니다. 의도 신호를 사용자에게 메시지를 표시하기 전에 수집해야 하고, 사용자가 해당 의도를 Windows Hello 도우미 장치 중 하나를 사용하여 제공하므로 여러 Windows Hello 도우미 디바이스가 오류 메시지를 표시하기 위해 경합하는 상황이 없어야 합니다. 그러므로 Windows Hello 도우미 디바이스 프레임워크는 큐를 전혀 유지하지 않습니다. 호출자가 오류 메시지를 요청하면 5초 동안 표시되고 5초 안에 오류 메시지를 표시하는 다른 모든 요청은 삭제됩니다. 5초가 지나면, 다른 호출자가 오류 메시지를 표시할 수 있는 기회가 발생합니다. 당사는 호출자가 오류 채널을 방해하는 것을 금지합니다.

지침 및 오류 메시지는 다음과 같습니다. 디바이스 이름은 ShowNotificationMessageAsync의 일부로 도우미 디바이스 앱에서 전달한 매개 변수입니다.

지침

  • "위로 살짝 밀거나 스페이스바를 눌러 디바이스 이름으로 로그인합니다."
  • “도우미 디바이스를 설정하고 있는 중입니다. 잠시 기다리거나 다른 로그인 옵션을 사용하세요.”
  • "NFC reader에서 디바이스 이름을 탭하여 로그인합니다."
  • "디바이스 이름을 찾는 중입니다..."
  • "USB 포트에 디바이스 이름을 연결하여 로그인합니다."

오류

  • "로그인 지침에 대해서는 디바이스 이름을 참조하세요."
  • "Bluetooth를 켜고 디바이스 이름을 사용하여 로그인합니다."
  • "NFC를 켜고 디바이스 이름을 사용하여 로그인합니다."
  • "Wi-Fi 네트워크에 연결하고 디바이스 이름을 사용하여 로그인합니다."
  • "디바이스 이름을 다시 탭합니다."
  • "엔터프라이즈에서 디바이스 이름으로 로그인할 수 없습니다. 다른 로그인 옵션을 사용하세요."
  • "디바이스 이름을 탭하여 로그인합니다."
  • "디바이스 이름에 손가락을 대고 로그인합니다."
  • "손가락으로 디바이스 이름을 밀어서 로그인합니다."
  • "디바이스 이름으로 로그인할 수 없습니다. 다른 로그인 옵션을 사용하세요."
  • "오류가 발생했습니다. 다른 로그인 옵션을 사용한 다음, 디바이스 이름을 다시 설정하세요."
  • "다시 시도하세요."
  • "디바이스 이름에 음성 암호를 말하십시오."
  • "디바이스 이름으로 로그인할 준비가 완료되었습니다."
  • "먼저 다른 로그인 옵션을 사용하면, 디바이스 이름을 사용하여 로그인할 수 있습니다."

등록된 디바이스 열거하기

Windows Hello 도우미 디바이스 앱은 FindAllRegisteredDeviceInfoAsync 호출을 통해 등록된 도우미 디바이스 목록을 열거할 수 있습니다. 이 API는 enum SecondaryAuthenticationFactorDeviceFindScope를 통해 정의된 두 가지 쿼리 형식을 지원합니다.

{
	User = 0,
	AllUsers,
}

첫 번째 범위는 로그온한 사용자의 디바이스 목록을 반환합니다. 두 번째는 해당 PC의 모든 사용자에 대한 목록을 반환합니다. 다른 사용자의 Windows Hello 도우미 디바이스를 등록 취소하지 않도록 하려면, 등록 취소 시에 첫 번째 범위를 사용해야 합니다. 두 번째는 인증 또는 등록 시 사용해야 합니다. 등록 시 이 열거형은 앱이 동일한 Windows Hello 도우미 디바이스를 두 번 등록하지 않도록 하는 데 도움이 될 수 있습니다.

앱이 이 검사를 수행하지 않더라도 PC는 동일한 Windows Hello 도우미 디바이스를 두 번 이상 등록하지 않고 거부합니다. 인증 시 AllUsers 범위를 사용하면 Windows Hello 도우미 장치 앱이 사용자 흐름을 전환하는 데 도움이 됩니다. 사용자 B가 로그인될 때 사용자 A에 로그온합니다(이 경우 두 사용자가 모두 Windows Hello 도우미 디바이스 앱을 설치하고 사용자 A가 PC에 도우미 디바이스를 등록하고 PC가 잠금 화면(또는 로그온 화면)에 있어야 함).

보안 요구 사항

도우미 인증 서비스는 다음의 보안 보호를 제공합니다.

  • 중간 사용자 또는 앱 컨테이너로 실행되는 Windows 10 데스크톱 디바이스의 맬웨어는 Windows Hello 도우미 디바이스를 사용하여 PC의 사용자 자격 증명 키(Windows Hello의 일부로 저장됨)에 자동으로 액세스할 수 없습니다.
  • Windows 10 데스크톱 디바이스의 악의적인 사용자는 해당 Windows 10 데스크톱 디바이스의 다른 사용자에 속한 Windows Hello 도우미 디바이스를 사용하여 동일한 Windows 10 데스크톱 디바이스에서 사용자 자격 증명 키에 자동으로 액세스할 수 없습니다.
  • Windows Hello 도우미 디바이스의 맬웨어는 Windows Hello 도우미 디바이스 프레임워크용으로 특별히 개발된 기능 또는 코드를 활용하는 것을 포함하여 Windows 10 데스크톱 디바이스의 사용자 자격 증명 키에 자동으로 액세스할 수 없습니다.
  • 악의적인 사용자는 Windows Hello 도우미 디바이스와 Windows 10 데스크톱 디바이스 간의 트래픽을 캡처하고 나중에 재생하여 Windows 10 데스크톱 디바이스의 잠금을 해제할 수 없습니다. 프로토콜에서 nonce, authkey 및 HMAC를 사용하면 재생 공격 방지가 보장됩니다.
  • 맬웨어 또는 루즈 PC의 악의적인 사용자는 Windows Hello 도우미 디바이스를 사용하여 정직한 사용자 PC에 액세스할 수 없습니다. 이는 프로토콜에서 인증 키와 HMAC를 사용하여 도우미 인증 서비스 및 Windows Hello 도우미 디바이스 간의 상호 인증을 통해 수행됩니다.

위에 열거된 보안 보호를 달성하기 위한 핵심은 무단 액세스로부터 HMAC 키를 보호하고 사용자의 현재 상태를 확인하는 것입니다. 보다 구체적으로, 다음의 요구 사항을 충족해야 합니다.

  • Windows Hello 도우미 디바이스 복제에 대한 보호 제공하기
  • 등록 시 HMAC 키를 PC로 보낼 때 도청 방지 기능 제공하기
  • 사용자 현재 상태 신호를 사용할 수 있는지 확인하기