Desbloqueio do Windows com dispositivos complementares (IoT) do Windows Hello

Um dispositivo complementar Windows Hello é um dispositivo que pode atuar em conjunto com seu desktop Windows 10 para melhorar a experiência de autenticação do usuário. Ao usar a estrutura de dispositivo complementar Windows Hello, um dispositivo complementar pode fornecer uma experiência avançada para o Windows Hello mesmo quando a biometria não está disponível (por exemplo, se o desktop Windows 10 não tiver uma câmera para autenticação facial nem dispositivo leitor de impressão digital).

Observação

A API para a estrutura de dispositivo complementar do Windows Hello foi preterida no Windows 10, versão 2004.

Introdução

Para obter exemplos de código, consulte o repositório Github da estrutura de dispositivo complementar do Windows Hello.

Casos de uso

Há várias maneiras de usar a estrutura de dispositivo complementar do Windows Hello para criar uma ótima experiência de desbloqueio do Windows com um dispositivo complementar. Por exemplo, os usuários podem:

  • Conectar seu dispositivo complementar ao PC via USB, tocar no botão do dispositivo complementar e desbloquear automaticamente o PC.
  • Levar um telefone no bolso que já esteja emparelhado com o PC por Bluetooth. Ao pressionar a barra de espaço do PC, o celular recebe uma notificação. Aprová-lo, e o PC simplesmente desbloqueia.
  • Tocar no dispositivo complementar para que um leitor NFC desbloqueie rapidamente o PC.
  • Usar uma pulseira fitness que já tenha autenticado o usuário. Ao se aproximar do PC e realizar um gesto especial (como bater palmas), o PC desbloqueia.

Dispositivos complementares do Windows Hello habilitados para biometria

Se o dispositivo complementar oferecer suporte a biometria, em alguns casos, a estrutura biométrica do Windows pode ser uma solução melhor do que a estrutura de dispositivo complementar do Windows Hello.

Componentes da solução

O diagrama abaixo descreve os componentes da solução e quem é responsável por criá-los.

visão geral da estrutura

A estrutura de dispositivo complementar do Windows Hello é implementada como um serviço em execução no Windows (chamado de Serviço de Autenticação Complementar neste artigo). Esse serviço é responsável por gerar um token de desbloqueio que precisa ser protegido por uma chave HMAC armazenada no dispositivo complementar do Windows Hello. Isso garante que o acesso ao token de desbloqueio exija a presença do dispositivo complementar do Windows Hello. Por cada tupla (PC, usuário do Windows), haverá um token de desbloqueio exclusivo.

A integração com a estrutura de dispositivo complementar do Windows Hello requer:

  • Um aplicativo de dispositivo complementar do Windows Hello para a Plataforma Universal do Windows (UWP) para o dispositivo complementar, baixado da loja de aplicativos do Windows.
  • A capacidade de criar duas chaves HMAC de 256 bits no dispositivo complementar do Windows Hello e gerar HMAC com ele (usando SHA-256).
  • Configurações de segurança definidas corretamente no desktop Windows 10. O Serviço de Autenticação Complementar exigirá que esse PIN seja configurado antes que qualquer dispositivo complementar do Windows Hello possa ser conectado a ele. Os usuários devem configurar um PIN por meio das opções de login de >contas> de configurações.

Além dos requisitos acima, o aplicativo de dispositivo complementar do Windows Hello é responsável por:

  • Experiência do usuário e identidade visual do registro inicial e do cancelamento do registro posterior do dispositivo complementar do Windows Hello.
  • Execução em segundo plano, descoberta do dispositivo complementar do Windows Hello, comunicação com o dispositivo complementar do Windows Hello e também com o Serviço de Autenticação Complementar.
  • Tratamento de erros

Normalmente, os dispositivos complementares são fornecidos com um aplicativo para configuração inicial, como configurar uma pulseira fitness pela primeira vez. A funcionalidade descrita neste documento pode fazer parte desse aplicativo, e um aplicativo separado não deve ser necessário.

Sinais do usuário

Cada dispositivo complementar do Windows Hello deve ser combinado com um aplicativo que ofereça suporte a três sinais do usuário. Esses sinais podem ser em forma de uma ação ou gesto.

  • Sinal de intenção: permite que o usuário mostre sua intenção de desbloqueio, por exemplo, pressionando um botão no dispositivo complementar do Windows Hello. O sinal de intenção deve ser coletado no lado do dispositivo complementar do Windows Hello.
  • Sinal de presença do usuário: comprova a presença do usuário. O dispositivo complementar do Windows Hello pode, por exemplo, exigir um PIN antes de poder ser usado para desbloquear o PC (não confundir com o PIN do PC) ou pode exigir o pressionamento de um botão.
  • Sinal de desambiguação: desambigua qual desktop Windows 10 o usuário deseja desbloquear quando várias opções estiverem disponíveis para o dispositivo complementar do Windows Hello.

Qualquer número desses sinais de usuário pode ser combinado em um. A presença do usuário e os sinais de intenção devem ser exigidos em cada uso.

Registro e comunicação futura entre um PC e dispositivos complementares do Windows Hello

Antes que um dispositivo complementar do Windows Hello possa ser conectado à estrutura de dispositivo complementar do Windows Hello, ele precisa ser registrado na estrutura. A experiência de registro é totalmente de propriedade do aplicativo de dispositivo complementar do Windows Hello.

A relação entre o dispositivo complementar do Windows Hello e o dispositivo de desktop do Windows 10 pode ser de um para muitos (ou seja, um dispositivo complementar pode ser usado para muitos dispositivos de desktop do Windows 10). No entanto, cada dispositivo complementar do Windows Hello só pode ser usado para um usuário em cada dispositivo de desktop do Windows 10.

Antes que um dispositivo complementar do Windows Hello possa se comunicar com um computador, eles precisam entrar em acordo quanto ao uso de um transporte. Essa escolha é deixada para o aplicativo de dispositivo complementar do Windows Hello. A estrutura de dispositivo complementar do Windows Hello não impõe quaisquer limitações ao tipo de transporte (USB, NFC, WiFi, BT, BLE etc.) ou ao protocolo que está sendo usado entre o dispositivo complementar do Windows Hello e o aplicativo de dispositivo complementar do Windows Hello no lado do dispositivo de desktop do Windows 10. No entanto, ele sugere certas considerações de segurança para a camada de transporte, conforme descrito na seção "Requisitos de segurança" deste documento. É responsabilidade do provedor do dispositivo fornecer esses requisitos. A estrutura não os fornece para você.

Modelo de interação do usuário

Descoberta, instalação e primeiro registro do aplicativo de dispositivo complementar do Windows Hello

Um fluxo de trabalho de usuário típico é assim:

  • O usuário configura o PIN em cada um dos dispositivos de desktop com Windows 10 de destino que deseja desbloquear com esse dispositivo complementar do Windows Hello.
  • O usuário executa o aplicativo de dispositivo complementar do Windows Hello em seu dispositivo de desktop com Windows 10 para registrar seu dispositivo complementar do Windows Hello no desktop com Windows 10.

Observações:

  • Recomendamos que a descoberta, o download e a inicialização do aplicativo de dispositivo complementar do Windows Hello sejam simplificados e, se possível, automatizados (por exemplo, o aplicativo pode ser baixado ao tocar no dispositivo complementar do Windows Hello em um leitor NFC no lado do dispositivo de desktop com Windows 10). No entanto, essa é a responsabilidade do dispositivo complementar do Windows Hello e do aplicativo de dispositivo complementar do Windows Hello.
  • Em um ambiente corporativo, o aplicativo de dispositivo complementar do Windows Hello pode ser implantado via MDM.
  • O aplicativo de dispositivo complementar do Windows Hello é responsável por mostrar ao usuário quaisquer mensagens de erro que aconteçam como parte do registro.

Registro e cancelamento de registro de protocolos

O diagrama a seguir ilustra como o dispositivo complementar do Windows Hello interage com o Serviço de Autenticação Complementar durante o registro.

Diagrama do fluxo de registro.

Existem duas chaves utilizadas em nosso protocolo:

  • Chave de dispositivo (devicekey): usada para proteger tokens de desbloqueio de que o PC precisa para desbloquear o Windows.
  • A chave de autenticação (authkey): usada para autenticar mutuamente o dispositivo complementar do Windows Hello e o Serviço de Autenticação Complementar.

A chave de dispositivo e as chaves de autenticação são trocadas no momento do registro entre o aplicativo de dispositivo complementar do Windows Hello e o dispositivo complementar do Windows Hello. Como resultado, o aplicativo de dispositivo complementar do Windows Hello e o dispositivo complementar do Windows Hello devem usar um transporte seguro para proteger as chaves.

Além disso, observe que, embora o diagrama acima exiba duas chaves HMAC geradas no dispositivo complementar do Windows Hello, também é possível para o aplicativo gerá-las e enviá-las para o dispositivo complementar do Windows Hello para armazenamento.

Iniciar fluxos de autenticação

Há duas maneiras de o usuário iniciar o fluxo de entrada no desktop com Windows 10 usando a estrutura de dispositivo complementar do Windows Hello (ou seja, fornecer sinal de intenção):

  • Abra a tampa do laptop ou pressione a barra de espaço ou deslize para cima no PC.
  • Execute um gesto ou uma ação no lado do dispositivo complementar do Windows Hello.

É o dispositivo complementar do Windows Hello que escolhe qual será o ponto de partida. A estrutura de dispositivo complementar do Windows Hello informará o aplicativo de dispositivo complementar quando a opção um acontecer. Para a opção dois, o aplicativo de dispositivo complementar do Windows Hello deve consultar o dispositivo complementar para ver se esse evento foi capturado. Isso garante que o dispositivo complementar do Windows Hello colete o sinal de intenção antes que o desbloqueio seja bem-sucedido.

Provedor de credenciais do dispositivo complementar do Windows Hello

Há um novo provedor de credenciais no Windows 10 que lida com todos os dispositivos complementares do Windows Hello.

O provedor de credenciais do dispositivo complementar do Windows Hello é responsável por iniciar a tarefa em segundo plano do dispositivo complementar por meio da ativação de um gatilho. O gatilho é definido na primeira vez quando o PC desperta e uma tela de bloqueio é exibida. A segunda vez é quando o PC está entrando na interface do usuário de login e o provedor de credenciais do dispositivo complementar do Windows Hello é o bloco selecionado.

A biblioteca auxiliar do aplicativo de dispositivo complementar do Windows Hello ouvirá a alteração de status da tela de bloqueio e enviará o evento correspondente à tarefa em segundo plano do dispositivo complementar do Windows Hello.

Se houver várias tarefas em segundo plano do dispositivo complementar do Windows Hello, a primeira tarefa em segundo plano que tiver concluído o processo de autenticação desbloqueará o PC. O serviço de autenticação de dispositivo complementar ignorará todas as chamadas de autenticação restantes.

A experiência no lado do dispositivo complementar do Windows Hello pertence e é gerenciada pelo aplicativo de dispositivo complementar do Windows Hello. A estrutura de dispositivo complementar do Windows Hello não tem controle sobre essa parte da experiência do usuário. Mais especificamente, o provedor de autenticação complementar informa o aplicativo de dispositivo complementar do Windows Hello (por meio de seu aplicativo em segundo plano) sobre alterações de estado na interface do usuário de logon (por exemplo, a tela de bloqueio acabou de aparecer ou o usuário acabou de dispensar a tela de bloqueio pressionando a barra de espaço), e é responsabilidade do aplicativo de dispositivo complementar do Windows Hello criar uma experiência em torno disso (por exemplo, quando o usuário pressiona a barra de espaço e dispensa a tela de desbloqueio, procura o dispositivo por USB).

A estrutura de dispositivo complementar do Windows Hello fornecerá um estoque de mensagens de texto e de erro (localizadas) para o aplicativo de dispositivo complementar do Windows Hello escolher. Elas serão exibidas na parte superior da tela de bloqueio (ou na interface de usuário de logon). Consulte a seção Lidar com mensagens e erros para obter mais detalhes.

Protocolo de autenticação

Depois que a tarefa em segundo plano associada a um aplicativo de dispositivo complementar do Windows Hello é iniciada, ela é responsável por solicitar ao dispositivo complementar do Windows Hello que valide um valor de HMAC calculado pelo Serviço de Autenticação Complementar e ajude a calcular dois valores de HMAC:

  • Validar HMAC de serviço = HMAC(chave de autenticação, nonce de serviço || nonce do dispositivo || nonce da sessão).
  • Calcule o HMAC da chave do dispositivo com um nonce.
  • Calcule o HMAC da chave de autenticação com o primeiro valor de HMAC concatenado com um nonce gerado pelo Serviço de Autenticação Complementar.

O segundo valor computado é usado pelo serviço para autenticar o dispositivo e também impedir o ataque de reprodução no canal de transporte.

Diagrama do fluxo de registro atualizado.

Gerenciamento do ciclo de vida

Registre-se uma vez, use em qualquer lugar

Sem um servidor de back-end, os usuários devem registrar seu dispositivo complementar do Windows Hello com cada dispositivo de desktop com Windows 10 separadamente.

Um fornecedor de dispositivo complementar ou OEM pode implementar um serviço Web para fazer roaming do estado de registro entre desktops com Windows 10 ou dispositivos móveis do usuário. Para obter mais detalhes, consulte a seção Serviço de roaming, revogação e filtro.

Gerência de PIN

Antes que um dispositivo complementar possa ser usado, um PIN precisa ser configurado no dispositivo de desktop com Windows 10. Isso garante que o usuário tenha um backup caso seu dispositivo complementar do Windows Hello não esteja funcionando. O PIN é algo que o Windows gerencia e que os aplicativos nunca veem. Para alterá-lo, o usuário navega até Configurações > Contas > Opções de entrada.

Gerenciamento e política

Os usuários podem remover um dispositivo complementar do Windows Hello de um desktop com Windows 10 executando o aplicativo de dispositivo complementar do Windows Hello nesse dispositivo de desktop.

As empresas têm duas opções para controlar a estrutura de dispositivo complementar do Windows Hello:

  • Ativar ou desativar o recurso
  • Definir a lista de permissões de dispositivos complementares do Windows Hello permitidos usando o AppLocker para Windows

A estrutura de dispositivo complementar do Windows Hello não oferece suporte a nenhuma maneira centralizada de manter o inventário de dispositivos complementares disponíveis ou a um método para filtrar ainda mais quais instâncias de um tipo de dispositivo complementar do Windows Hello são permitidas (por exemplo, apenas um dispositivo complementar com um número de série entre X e Y é permitido). Os desenvolvedores de aplicativos podem, no entanto, criar um serviço para fornecer essa funcionalidade. Para obter mais detalhes, consulte a seção Serviço de roaming, revogação e filtro.

Revogação

A estrutura de dispositivo complementar do Windows Hello não oferece suporte à remoção remota de um dispositivo complementar de um dispositivo de desktop específico com Windows 10. Em vez disso, os usuários podem remover o dispositivo complementar do Windows Hello por meio do aplicativo de dispositivo complementar do Windows Hello em execução nesse desktop com Windows 10.

Os fornecedores de dispositivos complementares, no entanto, podem criar um serviço para fornecer funcionalidade de revogação remota. Para obter mais detalhes, consulte a seção Serviço de roaming, revogação e filtro.

Serviços de roaming e filtros

Os fornecedores de dispositivos complementares podem implementar um serviço Web que pode ser usado nos seguintes cenários:

  • Um serviço de filtro para empresas: uma empresa pode limitar o conjunto de dispositivos complementares do Windows Hello que podem funcionar em seu ambiente a alguns poucos selecionados de um fornecedor específico. Por exemplo, a empresa Contoso poderia solicitar 10.000 dispositivos complementares do Modelo Y do Fornecedor X e garantir que apenas esses dispositivos funcionarão no domínio Contoso (e não em qualquer outro modelo de dispositivo do Fornecedor X).
  • Inventário: uma empresa pode determinar a lista de dispositivos complementares existentes usados em um ambiente corporativo.
  • Revogação em tempo real: se um funcionário relatar que seu dispositivo complementar foi perdido ou roubado, o serviço Web poderá ser usado para revogar esse dispositivo.
  • Roaming: um usuário só precisa registrar seu dispositivo complementar uma vez para que ele funcione em todos os seus desktops com Windows 10 e dispositivos móveis.

A implementação desses recursos requer que o aplicativo de dispositivo complementar do Windows Hello verifique com o serviço Web no momento do registro e do uso. O aplicativo de dispositivo complementar do Windows Hello pode ser otimizado para cenários de logon em cache, como exigir verificação com o serviço Web apenas uma vez por dia (ao custo de estender o tempo de revogação para até um dia).

Modelo de API da estrutura de dispositivo complementar do Windows Hello

Visão geral

Um aplicativo de dispositivo complementar do Windows Hello deve conter dois componentes: um aplicativo em primeiro plano com interface do usuário responsável por registrar e cancelar o registro do dispositivo e uma tarefa em segundo plano que lida com a autenticação.

O fluxo geral da API é o seguinte:

  1. Registrar o dispositivo complementar do Windows Hello
    • Verificar se o dispositivo está próximo e consultar sua capacidade (se necessário)
    • Gerar duas chaves HMAC (no lado do dispositivo complementar ou no lado do aplicativo)
    • Chamar RequestStartRegisteringDeviceAsync
    • Chamar FinishRegisteringDeviceAsync
    • Verificar se o aplicativo de dispositivo complementar do Windows Hello armazena chaves HMAC (se houver suporte) e se o aplicativo de dispositivo complementar do Windows Hello descarta suas cópias
  2. Registrar sua tarefa em segundo plano
  3. Aguardar o evento correto na tarefa em segundo plano
    • WaitingForUserConfirmation: aguarde esse evento se a ação/gesto do usuário no lado do dispositivo complementar do Windows Hello for necessário para iniciar o fluxo de autenticação
    • CollectingCredential: aguarde esse evento se o dispositivo complementar do Windows Hello depender da ação/gesto do usuário no lado do PC para iniciar o fluxo de autenticação (por exemplo, pressionar a barra de espaço)
    • Outro gatilho, como um smartcard: certifique-se de consultar o estado de autenticação atual para chamar as APIs corretas.
  4. Mantenha o usuário informado sobre mensagens de erro ou próximas etapas necessárias chamando ShowNotificationMessageAsync. Chame essa API somente quando um sinal de intenção for coletado
  5. Desbloquear
    • Verificar se os sinais de intenção e presença do usuário foram coletados
    • Chamar StartAuthenticationAsync
    • Comunicar-se com o dispositivo complementar para executar as operações de HMAC necessárias
    • Chamar FinishAuthenticationAsync
  6. Cancelar o registro de um dispositivo complementar do Windows Hello quando o usuário solicitá-lo (por exemplo, se tiver perdido o dispositivo complementar)
    • Enumerar o dispositivo complementar do Windows Hello para o usuário conectado via FindAllRegisteredDeviceInfoAsync
    • Cancelar o registro usando UnregisterDeviceAsync

Registro e cancelamento de registro

O registro requer duas chamadas de API para o Serviço de Autenticação Complementar: RequestStartRegisteringDeviceAsync e FinishRegisteringDeviceAsync.

Antes de qualquer uma dessas chamadas ser feita, o aplicativo de dispositivo complementar do Windows Hello deve verificar se o dispositivo complementar do Windows Hello está disponível. Se o dispositivo complementar do Windows Hello for responsável por gerar chaves HMAC (autenticação e chaves de dispositivo), o aplicativo de dispositivo complementar do Windows Hello também deverá solicitar ao dispositivo complementar para gerá-las antes de fazer qualquer uma das duas chamadas acima. Se o aplicativo de dispositivo complementar do Windows Hello for responsável por gerar chaves HMAC, ele deverá fazê-lo antes de chamar as duas chamadas acima.

Além disso, como parte da primeira chamada de API (RequestStartRegisteringDeviceAsync), o aplicativo de dispositivo complementar do Windows Hello deve decidir sobre a capacidade do dispositivo e estar preparado para passá-lo como parte da chamada de API. Por exemplo, se o dispositivo complementar do Windows Hello oferece suporte ao armazenamento seguro para chaves HMAC. Se o mesmo aplicativo de dispositivo complementar do Windows Hello for usado para gerenciar várias versões do mesmo dispositivo complementar e esses recursos forem alterados (e exigir uma consulta de dispositivo para decidir), recomendamos que essas consultas ocorram antes que a primeira chamada de API seja feita.

A primeira API (RequestStartRegisteringDeviceAsync) retornará um identificador usado pela segunda API (FinishRegisteringDeviceAsync). A primeira chamada para registro iniciará o prompt de PIN para garantir que o usuário esteja presente. Se nenhum PIN estiver configurado, essa chamada falhará. O aplicativo de dispositivo complementar do Windows Hello também pode consultar se o PIN está configurado ou não por meio da chamada KeyCredentialManager.IsSupportedAsync. A chamada RequestStartRegisteringDeviceAsync também pode falhar se a política tiver desabilitado o uso do dispositivo complementar do Windows Hello.

O resultado da primeira chamada é retornado via enumeração de 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
}

A segunda chamada (FinishRegisteringDeviceAsync) conclui o registro. Como parte do processo de registro, o aplicativo de dispositivo complementar do Windows Hello pode armazenar dados de configuração do dispositivo complementar com o Serviço de Autenticação Complementar. Há um limite de tamanho de 4.000 para esses dados. Esses dados estarão disponíveis para o aplicativo de dispositivo complementar do Windows Hello no momento da autenticação. Esses dados podem ser usados, por exemplo, para se conectar ao dispositivo complementar do Windows Hello, como um endereço MAC, ou se o dispositivo complementar do Windows Hello não tiver armazenamento e o dispositivo complementar quiser usar o PC para armazenamento, os dados de configuração poderão ser usados. Observe que todos os dados confidenciais armazenados como parte dos dados de configuração devem ser criptografados com uma chave que somente o dispositivo complementar do Windows Hello conheça. Além disso, como os dados de configuração são armazenados por um serviço do Windows, eles ficam disponíveis para o aplicativo de dispositivo complementar do Windows Hello em todos os perfis de usuário.

O aplicativo de dispositivo complementar do Windows Hello pode chamar AbortRegisteringDeviceAsync para cancelar o registro e passar um código de erro. O Serviço de Autenticação Complementar registrará o erro nos dados de telemetria. Um bom exemplo para essa chamada seria quando algo dá errado com o dispositivo complementar do Windows Hello e ele não pode concluir o registro (por exemplo, ele não pode armazenar chaves HMAC ou a conexão BT foi perdida).

O aplicativo de dispositivo complementar do Windows Hello deve fornecer uma opção para que o usuário cancele o registro do dispositivo complementar do Windows Hello no desktop com Windows 10 (por exemplo, se perdeu o dispositivo complementar ou comprou uma versão mais recente). Quando o usuário seleciona essa opção, o aplicativo de dispositivo complementar do Windows Hello deve chamar UnregisterDeviceAsync. Essa chamada pelo aplicativo de dispositivo complementar do Windows Hello acionará o serviço de autenticação de dispositivo complementar para excluir todos os dados (incluindo chaves HMAC) correspondentes à ID e à AppId específicas do dispositivo do aplicativo chamador do lado do PC. Essa chamada de API não tenta excluir chaves HMAC do aplicativo de dispositivo complementar do Windows Hello ou do lado do dispositivo complementar. Isso é deixado para o aplicativo de dispositivo complementar do Windows Hello implementar.

O aplicativo de dispositivo complementar do Windows Hello é responsável por mostrar todas as mensagens de erro que acontecem na fase de registro e cancelamento de registro.

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);
		}
	}
}

Autenticação

A autenticação requer duas chamadas de API para o Serviço de Autenticação Complementar: StartAuthenticationAsync e FinishAuthencationAsync.

A primeira API de iniciação retornará um identificador usado pela segunda API. A primeira chamada retorna, entre outras coisas, um nonce que, uma vez concatenado com outras coisas, precisa receber uma HMAC com a chave do dispositivo armazenada no dispositivo complementar do Windows Hello. A segunda chamada retorna os resultados da HMAC com a chave do dispositivo e pode potencialmente terminar em autenticação bem-sucedida (ou seja, o usuário verá sua área de trabalho).

A primeira API de iniciação (StartAuthenticationAsync) pode falhar se a política tiver desabilitado esse dispositivo complementar do Windows Hello após o registro inicial. Ela também pode falhar se a chamada de API tiver sido feita fora dos estados WaitingForUserConfirmation ou CollectingCredential (mais sobre isso mais adiante nesta seção). Ela também pode falhar se um aplicativo de dispositivo complementar não registrado chamá-la. A enumeração SecondaryAuthenticationFactorAuthenticationStatus resume os resultados possíveis:

{
	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
}

A segunda chamada de API (FinishAuthencationAsync) pode falhar se o nonce fornecido na primeira chamada expirar (20 segundos). A enumeração SecondaryAuthenticationFactorFinishAuthenticationStatus captura possíveis resultados.

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

O tempo de duas chamadas de API (StartAuthenticationAsync e FinishAuthencationAsync) precisa estar alinhado com a forma como o dispositivo complementar do Windows Hello coleta sinais de intenção, presença do usuário e desambiguação (consulte Sinais do usuário para obter mais detalhes). Por exemplo, a segunda chamada não deve ser enviada até que o sinal de intenção esteja disponível. Em outras palavras, o PC não deve desbloquear se o usuário não tiver manifestado intenção para ele. Para deixar isso mais claro, suponha que a proximidade Bluetooth é usada para desbloquear o PC, então um sinal de intenção explícito deve ser coletado, caso contrário, assim que o usuário passar por seu PC no caminho para a cozinha, o PC será desbloqueado. Além disso, o nonce retornado da primeira chamada possui limite de tempo (20 segundos) e expirará após determinado período. Como resultado, a primeira chamada só deve ser feita quando o aplicativo de dispositivo complementar do Windows Hello tiver uma boa indicação da presença do dispositivo complementar, por exemplo, o dispositivo complementar for inserido na porta USB ou o leitor NFC dele for tocado. Com o Bluetooth, deve-se tomar cuidado para evitar afetar a bateria no lado do PC ou afetar outras atividades Bluetooth que estão acontecendo nesse ponto ao verificar a presença do dispositivo complementar do Windows Hello. Além disso, se um sinal de presença do usuário precisar ser fornecido (por exemplo, digitando o PIN), é recomendável que a primeira chamada de autenticação seja feita somente depois que o sinal for coletado.

A estrutura de dispositivo complementar do Windows Hello ajuda o aplicativo de dispositivo complementar do Windows Hello a tomar decisões fundamentadas sobre quando fazer as duas chamadas acima, fornecendo uma imagem completa de onde o usuário está no fluxo de autenticação. A estrutura de dispositivo complementar do Windows Hello fornece essa funcionalidade emitindo uma notificação de alteração de estado de bloqueio para a tarefa em segundo plano do aplicativo.

fluxo do dispositivo complementar

Os detalhes de cada um desses estados são os seguintes:

Estadual Descrição
WaitingForUserConfirmation Esse evento de notificação de alteração de estado é acionado quando a tela de bloqueio aparece (por exemplo, o usuário pressionou Windows + L). Recomendamos não solicitar nenhuma mensagem de erro relacionada à dificuldade para encontrar um dispositivo nesse estado. Em geral, recomendamos mostrar mensagens apenas quando o sinal de intenção estiver disponível. O aplicativo de dispositivo complementar do Windows Hello deve fazer a primeira chamada de API para autenticação nesse estado se o dispositivo complementar coletar o sinal de intenção (por exemplo, tocar no leitor NFC, pressionar um botão no dispositivo complementar ou fazer um gesto específico, como bater palmas) e a tarefa em segundo plano do aplicativo de dispositivo complementar do Windows Hello receber indicação do dispositivo complementar de que o sinal de intenção foi detectado. Caso contrário, se o aplicativo de dispositivo complementar do Windows Hello depender do PC para iniciar o fluxo de autenticação (fazendo com que o usuário deslize a tela de desbloqueio para cima ou pressione a barra de espaço), o aplicativo de dispositivo complementar do Windows Hello precisará aguardar o próximo estado (CollectingCredential).
CollectingCredential Esse evento de notificação de alteração de estado é acionado quando o usuário abre a tampa do laptop, pressiona qualquer tecla do teclado ou deslize para cima para exibir a tela de desbloqueio. Se o dispositivo complementar do Windows Hello depender das ações acima para começar a coletar o sinal de intenção, o aplicativo de dispositivo complementar do Windows Hello deverá começar a coletá-lo (por exemplo, por meio de um pop-up no dispositivo complementar perguntando se o usuário deseja desbloquear o PC). Este seria um bom momento para fornecer casos de erro se o aplicativo de dispositivo complementar do Windows Hello precisar que o usuário forneça um sinal de presença do usuário no dispositivo complementar (como digitar o PIN no dispositivo complementar do Windows Hello).
SuspendingAuthentication Quando o aplicativo de dispositivo complementar do Windows Hello recebe esse estado, isso significa que o Serviço de Autenticação Complementar parou de aceitar solicitações de autenticação.
CredentialCollected Isso significa que outro aplicativo de dispositivo complementar do Windows Hello chamou a segunda API e que o Serviço de Autenticação Complementar está verificando o que foi enviado. Neste ponto, o Serviço de Autenticação Complementar não está aceitando nenhuma outra solicitação de autenticação, a menos que a enviada atualmente não passe na verificação. O aplicativo de dispositivo complementar do Windows Hello deve permanecer ajustado até que o próximo estado seja atingido.
CredentialAuthenticated Isso significa que a credencial enviada funcionou. O credentialAuthenticated tem a ID do dispositivo complementar do Windows Hello que foi bem-sucedido. O aplicativo de dispositivo complementar do Windows Hello deve verificar isso para ver se o dispositivo associado foi o vencedor. Caso contrário, o aplicativo de dispositivo complementar do Windows Hello deve evitar mostrar quaisquer fluxos de pós-autenticação (como mensagem de sucesso no dispositivo complementar ou talvez uma vibração nesse dispositivo). Observe que, se a credencial enviada não funcionar, o estado será alterado para o estado CollectingCredential.
StoppingAuthentication A autenticação foi bem-sucedida, e o usuário viu a área de trabalho. Hora de matar sua tarefa em segundo plano. Antes de sair da tarefa em segundo plano, cancele explicitamente o registro do identificador StageEvent. Isso ajudará a tarefa em segundo plano a sair rapidamente.

Os aplicativos de dispositivo complementar do Windows Hello só devem chamar as duas APIs de autenticação nos dois primeiros estados. Os aplicativos de dispositivo complementar do Windows Hello devem verificar em que cenário esse evento está sendo acionado. Há duas possibilidades: desbloquear ou pós-desbloquear. No momento, apenas desbloquear é compatível. Nas próximas versões, cenários pós-desbloqueio podem ser suportados. A enumeração SecondaryAuthenticationFactorAuthenticationScenario captura estas duas opções:

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

Exemplo de código completo:

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();
		}
	}
}

Registrar uma tarefa em segundo plano

Quando o aplicativo de dispositivo complementar do Windows Hello registra o primeiro dispositivo complementar, ele também deve registrar seu componente de tarefa em segundo plano que passará informações de autenticação entre o dispositivo e o serviço de autenticação do dispositivo complementar.

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;
		}
	}
}

Erros e mensagens

A estrutura de dispositivo complementar do Windows Hello é responsável por fornecer comentários ao usuário sobre o sucesso ou a falha ao entrar. A estrutura de dispositivo complementar do Windows Hello fornecerá um estoque de mensagens de texto e de erro (localizadas) para o aplicativo de dispositivo complementar do Windows Hello escolher. Elas serão exibidas na interface do usuário de logon.

erro de dispositivo complementar

Os aplicativos de dispositivo complementar do Windows Hello podem usar ShowNotificationMessageAsync para mostrar mensagens ao usuário como parte da interface do usuário de logon. Chame essa API quando um sinal de intenção estiver disponível. Observe que um sinal de intenção sempre deve ser coletado no lado do dispositivo complementar do Windows Hello.

Existem dois tipos de mensagens: orientação e erros.

As mensagens de orientação são projetadas para mostrar ao usuário como iniciar o processo de desbloqueio. Essas mensagens só são mostradas ao usuário uma vez na tela de bloqueio, após o primeiro registro do dispositivo, e nunca mais são mostradas lá. Essas mensagens continuarão a ser exibidas na tela de bloqueio.

As mensagens de erro são sempre mostradas e serão mostradas depois que um sinal de intenção for fornecido. Como um sinal de intenção deve ser coletado antes de mostrar mensagens ao usuário, e o usuário fornecerá essa intenção usando apenas um dos dispositivos complementares do Windows Hello, não deve haver uma situação em que vários dispositivos complementares do Windows Hello corram para mostrar mensagens de erro. Como resultado, a estrutura de dispositivo complementar do Windows Hello não mantém nenhuma fila. Quando um chamador solicita uma mensagem de erro, ela será mostrada por 5 segundos, e todas as outras solicitações para mostrar uma mensagem de erro nesses 5 segundos serão descartadas. Uma vez passados os 5 segundos, surge a oportunidade de outro chamador mostrar uma mensagem de erro. Proibimos qualquer chamador de bloquear o canal de erro.

As mensagens de orientação e erro são as seguintes. O nome do dispositivo é um parâmetro passado pelo aplicativo de dispositivo complementar como parte de ShowNotificationMessageAsync.

Diretrizes

  • "Deslize para cima ou pressione a barra de espaço para entrar com o nome do dispositivo."
  • "Configurando seu dispositivo complementar. Aguarde ou use outra opção de login."
  • "Toque no nome do dispositivo no leitor NFC para entrar."
  • "Procurando o nome do dispositivo ..."
  • "Conecte o nome do dispositivo a uma porta USB para entrar."

Erros

  • "Consulte nome do dispositivo para obter instruções de entrada."
  • "Ative o Bluetooth para usar nome do dispositivo para entrar."
  • "Ative o NFC para usar nome do dispositivo para entrar."
  • "Conecte-se a uma rede Wi-Fi para usar nome do dispositivo para entrar."
  • "Toque novamente em nome do dispositivo."
  • "Sua empresa impede a entrada com nome do dispositivo. Use outra opção de login."
  • "Toque em nome do dispositivo para entrar."
  • "Coloque o dedo em nome do dispositivo para entrar."
  • "Deslize o dedo em nome do dispositivo para entrar."
  • "Não foi possível entrar com nome do dispositivo. Use outra opção de login."
  • "Algo deu errado. Use outra opção de entrada e configure nome do dispositivo novamente."
  • "Tente novamente."
  • "Diga sua senha falada em nome do dispositivo."
  • "Pronto para entrar com nome do dispositivo."
  • "Use outra opção de entrada primeiro, depois você pode usar nome do dispositivo para entrar."

Enumerar dispositivos registrados

O aplicativo de dispositivo complementar do Windows Hello pode enumerar a lista de dispositivos complementares registrados por meio da chamada FindAllRegisteredDeviceInfoAsync. Essa API oferece suporte a dois tipos de consulta definidos via enumeração SecondaryAuthenticationFactorDeviceFindScope:

{
	User = 0,
	AllUsers,
}

O primeiro escopo retorna a lista de dispositivos para o usuário conectado. O segundo retorna a lista para todos os usuários nesse PC. O primeiro escopo deve ser usado no momento do cancelamento do registro para evitar o cancelamento do registro do dispositivo complementar do Windows Hello de outro usuário. O segundo deve ser usado no momento da autenticação ou do registro: no momento do registro, essa enumeração pode ajudar o aplicativo a evitar tentar registrar o mesmo dispositivo complementar do Windows Hello duas vezes.

Observe que, mesmo que o aplicativo não execute essa verificação, o PC rejeita e rejeitará que o mesmo dispositivo complementar do Windows Hello seja registrado mais de uma vez. No momento da autenticação, o uso do escopo AllUsers ajuda o aplicativo de dispositivo complementar do Windows Hello a apoiar a mudança de fluxo do usuário: faça logon do usuário A quando o usuário B estiver conectado (isso requer que ambos os usuários tenham instalado o aplicativo de dispositivo complementar do Windows Hello e o usuário A tenha registrado seus dispositivos complementares no PC, e o PC esteja na tela de bloqueio (ou tela de logon)).

Requisitos de segurança

O Serviço de Autenticação Complementar fornece as seguintes proteções de segurança.

  • Malware em um dispositivo de desktop com Windows 10 executado como um usuário médio ou contêiner de aplicativo não pode usar o dispositivo complementar do Windows Hello para acessar chaves de credenciais de usuário (armazenadas como parte do Windows Hello) em um PC silenciosamente.
  • Um usuário mal-intencionado em um dispositivo de desktop com Windows 10 não pode usar o dispositivo complementar do Windows Hello que pertence a outro usuário nesse dispositivo de desktop com Windows 10 para obter acesso silencioso às suas chaves de credenciais de usuário (no mesmo dispositivo de desktop com Windows 10).
  • O malware no dispositivo complementar do Windows Hello não pode obter acesso silencioso às chaves de credenciais do usuário em um dispositivo de desktop com Windows 10, incluindo o aproveitamento da funcionalidade ou do código desenvolvido especificamente para a estrutura do dispositivo complementar do Windows Hello.
  • Um usuário mal-intencionado não pode desbloquear um dispositivo de desktop com Windows 10 capturando o tráfego entre o dispositivo complementar do Windows Hello e o dispositivo de desktop com Windows 10 e reproduzindo-o mais tarde. O uso de nonce, authkey e HMAC em nosso protocolo garante proteção contra um ataque de reprodução.
  • Malware ou um usuário mal-intencionado em um PC não autorizado não pode usar o dispositivo complementar do Windows Hello para obter acesso ao PC do usuário honesto. Isso é alcançado por meio da autenticação mútua entre o Serviço de Autenticação Complementar e o dispositivo complementar do Windows Hello por meio do uso de authkey e HMAC em nosso protocolo.

A chave para obter as proteções de segurança enumeradas acima é proteger as chaves HMAC contra acesso não autorizado e também verificar a presença do usuário. Mais especificamente, deve satisfazer os seguintes requisitos:

  • Fornecer proteção contra clonagem do dispositivo complementar do Windows Hello
  • Fornecer proteção contra espionagem ao enviar chaves HMAC no momento do registro para o PC
  • Verificar se o sinal de presença do usuário está disponível