Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Um dispositivo complementar do Windows Hello é um dispositivo que pode atuar em conjunto com a área de trabalho do Windows 10 para aprimorar a experiência de autenticação do usuário. Usando a estrutura de dispositivo complementar do Windows Hello, um dispositivo complementar pode fornecer uma experiência rica para o Windows Hello mesmo quando a biometria não está disponível (por exemplo, se a área de trabalho do Windows 10 não tiver uma câmera para autenticação facial ou dispositivo leitor de impressão digital, por exemplo).
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 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 utilizadores poderiam:
- Ligue o dispositivo complementar ao PC através de USB, toque no botão do dispositivo complementar e desbloqueie automaticamente o PC.
- Leve um telefone no bolso que já esteja emparelhado com o PC por Bluetooth. Ao bater na barra de espaço do PC, o telefone recebe uma notificação. Aprová-lo e o PC simplesmente desbloqueia.
- Toque com o seu dispositivo complementar num leitor NFC para desbloquear rapidamente o PC.
- Use uma pulseira de fitness que já tenha autenticado o utilizador. Ao aproximar-se do PC, e executando um gesto especial (como bater palmas), o PC desbloqueia.
Dispositivos complementares do Windows Hello habilitados para biometria
Se o dispositivo complementar suportar biometria, em alguns casos, a estrutura biométrica do Windows pode ser uma solução melhor do que a estrutura de dispositivos complementares do Windows Hello.
Componentes da solução
O diagrama abaixo mostra os componentes da solução e quem é responsável por construí-los.
A estrutura do 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). Este 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 requer 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 o Windows Hello Companion Device Framework requer:
- Uma aplicação da Plataforma Universal do Windows (UWP) do Windows Hello para o dispositivo complementar, descarregada da loja de aplicações 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 na área de trabalho do Windows 10 configuradas corretamente. O Serviço de Autenticação Complementar exigirá que este PIN seja configurado antes que qualquer dispositivo complementar do Windows Hello possa ser conectado a ele. Os utilizadores têm de configurar um PIN através das opções Definições > Contas > Iniciar sessão.
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 posterior cancelamento do registro do dispositivo complementar do Windows Hello.
- Em execução em segundo plano, descobrindo o dispositivo complementar do Windows Hello, comunicando-se 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 banda de ginástica 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 utilizador
Cada dispositivo complementar do Windows Hello deve ser combinado com um aplicativo que ofereça suporte a três sinais de usuário. Estes sinais podem assumir a 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 do 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 pressionar um botão.
- Sinal de desambiguação: Desambiguar qual ambiente de trabalho do Windows 10 o utilizador deseja desbloquear quando várias opções estão 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 utilizador e os sinais de intenção devem ser exigidos em cada utilização.
Registo e comunicação futura entre um PC e dispositivos complementares do Windows Hello
Antes que um dispositivo complementar do Windows Hello possa ser integrado na estrutura do dispositivo complementar do Windows Hello, ele precisa ser registrado na estrutura. A experiência de registo é gerida exclusivamente pelo aplicativo de dispositivo complementar do Windows Hello.
A relação entre o dispositivo complementar do Windows Hello e o dispositivo de área de trabalho do Windows 10 pode ser de um-para-muitos (ou seja, um dispositivo complementar pode ser usado para muitos dispositivos de área de trabalho do Windows 10). No entanto, cada dispositivo complementar do Windows Hello só pode ser usado para um usuário em cada dispositivo de área de trabalho do Windows 10.
Antes que um dispositivo complementar do Windows Hello possa se comunicar com um PC, ele precisa concordar com um transporte a ser usado. Essa escolha é deixada para o aplicativo de dispositivo complementar do Windows Hello; a estrutura do 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á a ser utilizado entre o dispositivo complementar do Windows Hello e a aplicação de dispositivo complementar do Windows Hello no lado do dispositivo de ambiente de trabalho 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. É da responsabilidade do fornecedor do dispositivo fornecer esses requisitos. A estrutura não os fornece para você.
Modelo de interação do usuário
A estrutura de dispositivo complementar do Windows Hello foi projetada para ser usada em uma variedade de cenários. O modelo de interação do usuário é flexível e pode ser adaptado às necessidades específicas do dispositivo complementar do Windows Hello e seu aplicativo.
Descoberta, instalação e registro pela primeira vez do aplicativo de dispositivo complementar do Windows Hello
Um fluxo de trabalho de usuário típico é o seguinte:
- O utilizador configura o PIN em cada um dos dispositivos de ambiente de trabalho Windows 10 de destino que pretende desbloquear com esse dispositivo complementar do Windows Hello.
- O usuário executa o aplicativo de dispositivo complementar do Windows Hello em seu dispositivo de área de trabalho Windows 10 para registrar seu dispositivo complementar do Windows Hello com a área de trabalho do 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 desktop Windows 10). No entanto, esta é a responsabilidade do dispositivo complementar do Windows Hello e da respetiva aplicação.
- 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 todas as mensagens de erro que acontecem como parte do registro.
Protocolo de registo e cancelamento de registo
O diagrama a seguir ilustra como o dispositivo complementar do Windows Hello interage com o Serviço de Autenticação Complementar durante o registro.
Existem duas chaves utilizadas no nosso protocolo:
- Chave de dispositivo (devicekey): usada para proteger tokens de desbloqueio 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 do dispositivo e as chaves de autenticação são trocadas no momento do registo entre a aplicação 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.
Iniciando fluxos de autenticação
Há duas maneiras de o usuário iniciar o fluxo de entrada na área de trabalho do 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.
- Efetue um gesto ou uma ação no dispositivo complementar do Windows Hello.
Cabe ao dispositivo complementar do Windows Hello escolher qual é o ponto de partida. O framework do dispositivo complementar do Windows Hello notificará a aplicação de dispositivo complementar quando a primeira opção ocorrer. 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 de 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 computador está a entrar na interface de utilizador de início de sessão e o fornecedor de credenciais de dispositivo complementar do Windows Hello é o bloco selecionado.
A biblioteca de apoio para a aplicação do dispositivo complementar do Windows Hello monitorizará a alteração de estado do ecrã 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 concluiu 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 cair ou o usuário acabou de dissipar 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, após o usuário bater na barra de espaço e dissipar a tela de desbloqueio, comece a procurar o dispositivo por USB).
O Framework do dispositivo complementar Windows Hello fornecerá um conjunto de textos (localizados) e mensagens de erro para o aplicativo do dispositivo complementar Windows Hello escolher. Eles serão exibidos na parte superior da tela de bloqueio (ou na interface do usuário de logon). Consulte a seção Lidando 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, ele é responsável por solicitar ao dispositivo complementar do Windows Hello que valide um valor HMAC calculado pelo Serviço de Autenticação Complementar e ajude a calcular dois valores HMAC:
- Validar serviço HMAC = HMAC (chave de autenticação, serviço nonce || dispositivo nonce || sessão nonce).
- Calcule o HMAC da chave do dispositivo com um nonce.
- Calcule o HMAC da chave de autenticação com o primeiro valor HMAC concatenado com um nonce gerado pelo Serviço de Autenticação Complementar.
O segundo valor calculado é usado pelo serviço para autenticar o dispositivo e também evitar ataques de repetição no canal de transporte.
Gestão do ciclo de vida
Registe-se uma vez, use em qualquer lugar
Sem um servidor de back-end, os usuários devem registrar seu dispositivo complementar do Windows Hello em cada dispositivo desktop Windows 10 separadamente.
Um fornecedor de dispositivo complementar ou OEM pode implementar um serviço Web para propagar o estado de registo entre desktops ou dispositivos móveis de utilizadores do Windows 10. Para obter mais detalhes, consulte a seção Roaming, Revogação e Serviço de Filtro.
Gestão de PIN
Antes que um dispositivo complementar possa ser usado, um PIN precisa ser configurado no dispositivo desktop 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 gere e que as aplicações nunca veem. Para alterá-lo, o usuário navega até Configurações > Contas > opções de login.
Gestão e política
Os utilizadores podem remover um dispositivo complementar do Windows Hello de um ambiente de trabalho do Windows 10 executando a aplicação de dispositivo complementar do Windows Hello nesse dispositivo de ambiente de trabalho.
As empresas têm duas opções para controlar a estrutura do 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 Windows app locker
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 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). No entanto, os desenvolvedores de aplicativos podem criar um serviço para fornecer essa funcionalidade. Para obter mais detalhes, consulte a seção Roaming, Revogação e Serviço de Filtro.
Revogação
A estrutura de dispositivo complementar do Windows Hello não suporta a remoção remota de um dispositivo complementar de um dispositivo de área de trabalho Windows 10 específico. Em vez disso, os utilizadores podem remover o dispositivo complementar do Windows Hello através da aplicação de dispositivo complementar do Windows Hello em execução nesse ambiente de trabalho do 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 Roaming, Revogação e Serviço de Filtro.
Serviços de roaming e filtragem
Os fornecedores de dispositivos complementares podem implementar um serviço Web que pode ser usado para os 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 selecionados de um fornecedor específico. Por exemplo, a empresa Contoso pode encomendar 10.000 dispositivos complementares do Modelo Y do Fornecedor X e garantir que apenas esses dispositivos funcionem no domínio da 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 pode ser usado para revogar esse dispositivo.
- Roaming: um usuário só precisa registrar seu dispositivo companheiro uma vez e ele funciona em todos os seus desktops Windows 10 e Mobile.
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. A aplicação de dispositivo complementar do Windows Hello pode otimizar para cenários de login em cache, como requerer 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 a 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:
- Registar o dispositivo complementar do Windows Hello
- Certifique-se de que o dispositivo está por perto e consulte a sua capacidade (se necessário)
- Gere duas chaves HMAC (no lado do dispositivo complementar ou no lado do aplicativo)
- Chamada RequestStartRegisteringDeviceAsync
- Chamada FinishRegisteringDeviceAsync
- Certifique-se de que a aplicação de dispositivo complementar do Windows Hello armazena chaves HMAC (se suportada) e a aplicação de dispositivo complementar do Windows Hello elimina as respetivas cópias
- Registe a sua tarefa em segundo plano
- Aguarde o evento certo na tarefa em segundo plano
- WaitingForUserConfirmation: aguarde este 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 este 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, pressionando a barra de espaço)
- Outro gatilho, como um cartão inteligente: certifique-se de consultar o estado de autenticação atual para chamar as APIs corretas.
- 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
- Desbloqueio
- Certifique-se de que os sinais de intenção e presença do usuário foram coletados
- Chamar StartAuthenticationAsync
- Comunique-se com o dispositivo complementar para executar as operações HMAC necessárias
- Execute FinishAuthenticationAsync
- Cancelar o registro de um dispositivo complementar do Windows Hello quando o usuário o solicitar (por exemplo, se ele perdeu o dispositivo complementar)
- Enumerar o dispositivo complementar do Windows Hello para usuário conectado via FindAllRegisteredDeviceInfoAsync
- Cancelar o registro usando UnregisterDeviceAsync
Registo e cancelamento do registo
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 certificar-se de que o dispositivo complementar do Windows Hello está disponível. Se o dispositivo complementar do Windows Hello for responsável pela geração de 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, 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á-la como parte da chamada de API; por exemplo, se o dispositivo complementar do Windows Hello suporta 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 exigirem uma consulta de dispositivo para decidir), recomendamos que essas consultas ocorram antes da primeira chamada de API ser feita.
A primeira API (RequestStartRegisteringDeviceAsync) retornará um identificador usado pela segunda API (FinishRegisteringDeviceAsync). A primeira chamada para registro iniciará o prompt do PIN para garantir que o usuário esteja presente. Se nenhum PIN estiver configurado, esta 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 desativado o uso do dispositivo complementar do Windows Hello.
O resultado da primeira chamada é retornado via enum 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 4K 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 apenas o dispositivo complementar do Windows Hello conhece. Além disso, dado que os dados de configuração são armazenados por um serviço do Windows, eles estão 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 esta chamada seria quando algo correu mal com o dispositivo complementar do Windows Hello e este não conseguiu concluir o registo (por exemplo, não pode armazenar chaves HMAC ou a ligaçã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 da área de trabalho do 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 feita 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 do dispositivo específico do aplicativo chamador do lado do PC. Esta chamada de API não tenta excluir chaves HMAC nem da aplicação de dispositivo complementar do Windows Hello, nem do dispositivo complementar em si. Cabe à aplicação de dispositivo auxiliar do Windows Hello implementar isso.
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 informações, precisa ser autenticado com HMAC usando a chave do dispositivo associada ao dispositivo complementar do Windows Hello. A segunda chamada retorna os resultados do 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 desativado esse dispositivo complementar do Windows Hello após o registro inicial. Ele também pode falhar se a chamada de API foi feita fora dos estados WaitingForUserConfirmation ou CollectingCredential (mais sobre isso mais adiante nesta seção). Ele também pode falhar se um aplicativo de dispositivo complementar não registrado chamá-lo. SecondaryAuthenticationFactorAuthenticationStatus Enum 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 (FinishAuthenticationAsync) pode falhar se o nonce fornecido na primeira chamada expirar após 20 segundos. O enum 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 expressou intenção de o fazer. Para deixar isso mais claro, assuma que a proximidade Bluetooth é usada para desbloquear o PC, então um sinal de intenção explícita deve ser coletado, caso contrário, assim que o usuário passar por seu PC a caminho da cozinha, o PC será desbloqueado. Além disso, o nonce retornado da primeira chamada tem 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 é inserido na porta USB ou tocado no leitor NFC. Com Bluetooth, deve-se tomar cuidado para evitar afetar a bateria do PC ou outras atividades Bluetooth em curso ao verificar a presença do dispositivo companheiro do Windows Hello. Além disso, se um sinal de presença do usuário precisar ser fornecido (por exemplo, digitando PIN), é recomendável que a primeira chamada de autenticação só seja feita depois que esse sinal for coletado.
A estrutura do dispositivo complementar do Windows Hello ajuda o aplicativo de dispositivo complementar do Windows Hello a tomar decisões informadas sobre quando fazer 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 fornecendo notificação de alteração de estado de bloqueio para a tarefa em segundo plano do aplicativo.
Os detalhes de cada um desses estados são os seguintes:
| Estado | Descrição |
|---|---|
| AguardandoConfirmaçãoDoUtilizador | Esse evento de notificação de alteração de estado é acionado quando a tela de bloqueio desce (por exemplo, o usuário pressionou Windows + L). Recomendamos não solicitar nenhuma mensagem de erro relacionada à dificuldade de 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 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 detetado. Caso contrário, se o aplicativo de dispositivo complementar do Windows Hello depender do computador para iniciar o fluxo de autenticação (fazendo com que o usuário passe o dedo para cima na tela de desbloqueio ou pressionando a barra de espaço), o aplicativo de dispositivo complementar do Windows Hello precisará aguardar o próximo estado (CollectingCredential). |
| Recolha de Credenciais | Esse evento de notificação de alteração de estado é acionado quando o usuário abre a tampa do laptop, bate em qualquer tecla do teclado ou desliza para cima até 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 deve 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 PIN no dispositivo complementar do Windows Hello). |
| SuspendendoAutenticação | 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. |
| Credencial Recolhida | 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 ficar atento 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 teve êxito. 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 uma mensagem de sucesso no dispositivo complementar ou talvez uma vibração nesse dispositivo). Observe que, se a credencial enviada não funcionar, o estado mudará para o estado de recolha de credenciais. |
| A parar autenticação | A autenticação foi bem-sucedida e o usuário viu a área de trabalho. Hora de encerrar a sua tarefa em segundo plano. Antes de sair da tarefa em segundo plano, cancele explicitamente o registro do manipulador StageEvent. Isso ajudará a tarefa em segundo plano a sair rapidamente. |
Os aplicativos de dispositivo complementares do Windows Hello só devem chamar as duas APIs de autenticação nos dois primeiros estados. As aplicações de dispositivos complementares do Windows Hello devem verificar qual o cenário em que este evento é acionado. Existem duas possibilidades: desbloquear ou pós-desbloqueio. Atualmente, apenas o desbloqueio é suportado. Em versões futuras, cenários pós-desbloqueio podem ser suportados. O enum 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 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();
}
}
}
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 da entrada. A estrutura do dispositivo complementar do Windows Hello fornecerá um conjunto de textos (localizados) e mensagens de erro para o aplicativo de dispositivo complementar do Windows Hello selecionar. Eles serão exibidos na interface do usuário de logon.
erro do dispositivo complementar
As aplicações de dispositivos complementares do Windows Hello podem usar ShowNotificationMessageAsync para mostrar mensagens ao utilizador como parte da interface de início de sessão. Chame essa API quando um sinal de intenção estiver disponível. Observe que um sinal de intenção deve ser sempre coletado no dispositivo auxiliar 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, no primeiro registro do dispositivo, e nunca mais são mostradas lá. Estas mensagens continuarão a ser apresentadas no ecrã de bloqueio.
As mensagens de erro são sempre mostradas e serão mostradas depois que um sinal de intenção for fornecido. Dado que um sinal de intenção deve ser coletado antes de mostrar mensagens ao usuário, e o usuário fornecerá essa intenção apenas usando 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 dispositivos complementares 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 5 segundos, surge a oportunidade de outro chamador mostrar uma mensagem de erro. Proibimos qualquer chamador de obstruir o canal de erro.
As orientações e as mensagens de erro são as seguintes. O nome do dispositivo é um parâmetro passado pelo aplicativo de dispositivo complementar como parte de ShowNotificationMessageAsync.
Orientação
- "Passe o dedo para cima ou pressione a barra de espaço para entrar com nome do dispositivo."
- Configuração do seu dispositivo auxiliar. Aguarde ou utilize outra opção de início de sessão."
- Toque no leitor NFC com o nome do dispositivo para iniciar sessão.
- À procura do nome do dispositivo ...
- Conecte o dispositivo chamado a uma porta USB para iniciar sessão.
Erros
- Consulte o nome do dispositivo para obter instruções de como iniciar sessão.
- "Ative o Bluetooth para utilizar o dispositivo com o nome para iniciar sessão."
- "Ative o NFC para usar o dispositivo com o nome para entrar."
- "Conecte-se a uma rede Wi-Fi para usar nome do dispositivo para entrar."
- Toque novamente em “nome do dispositivo” .
- A sua empresa impede o início de sessão com o nome do dispositivo . Utilize outra opção de início de sessão."
- "Toque nome do dispositivo para iniciar sessão."
- Apoie o dedo no nome do dispositivo para entrar.
- "Deslize o dedo sobre nome do dispositivo para entrar."
- "Não foi possível iniciar sessão com nome do dispositivo. Utilize outra opção de início de sessão."
- "Algo correu mal. Utilize outra opção de início de sessão e, em seguida, configure nome do dispositivo novamente."
- "Tente novamente."
- Diga a sua senha falada em nome do dispositivo.
- Pronto para iniciar sessão com o dispositivo nome .
- "Use outra opção de login primeiro, depois você pode usar nome do dispositivo para entrar."
Enumerando dispositivos registrados
O aplicativo de dispositivo complementar do Windows Hello pode enumerar a lista de dispositivos complementares registrados por meio da chamada FindAllRegisteredDeviceInfoAsync. Esta API suporta dois tipos de consulta definidos via enum SecondaryAuthenticationFactorDeviceFindScope:
{
User = 0,
AllUsers,
}
O primeiro escopo retorna a lista de dispositivos para o utilizador autenticado. O segundo retorna a lista para todos os usuários nesse PC. O primeiro escopo deve ser usado durante a anulação do registo para evitar a anulação do registo do dispositivo auxiliar Windows Hello de outro utilizador. 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 suportar a troca de utilizadores: iniciar sessão com o utilizador A quando o utilizador B já estiver ligado (isso requer que ambos os utilizadores tenham instalado o aplicativo de dispositivo complementar do Windows Hello e que o utilizador A tenha registado os seus dispositivos complementares no PC e que o PC esteja na tela de bloqueio (ou tela de início de sessão)).
Requisitos de segurança
O Serviço de Autenticação Complementar fornece as seguintes proteções de segurança.
- Malware num dispositivo desktop Windows 10 a executar como um utilizador intermédio ou contêiner de aplicações não pode usar o dispositivo complementar do Windows Hello para aceder a chaves de credenciais de utilizador (armazenadas como parte do Windows Hello) num PC de forma silenciosa.
- Um utilizador mal-intencionado num dispositivo de ambiente de trabalho Windows 10 não pode utilizar o dispositivo complementar do Windows Hello que pertence a outro utilizador nesse dispositivo de ambiente de trabalho Windows 10 para obter acesso silencioso às suas chaves de credenciais de utilizador (no mesmo dispositivo de ambiente de trabalho Windows 10).
- O malware presente no dispositivo complementar do Windows Hello não consegue obter de forma discreta acesso às chaves de credenciais do utilizador em um dispositivo de desktop com Windows 10, incluindo a utilização de funcionalidades ou código desenvolvidos especificamente para o framework do dispositivo complementar do Windows Hello.
- Um usuário mal-intencionado não pode desbloquear um dispositivo de área de trabalho do Windows 10 capturando o tráfego entre o dispositivo complementar do Windows Hello e o dispositivo de área de trabalho do Windows 10 e reproduzindo-o mais tarde. O uso de nonce, authkey e HMAC em nosso protocolo garante proteção contra um ataque de replay.
- Malware ou um utilizador malicioso num PC desonesto não pode usar o dispositivo complementar do Windows Hello para obter acesso ao PC do utilizador legítimo. Isto é conseguido através da autenticação mútua entre o Serviço de Autenticação Complementar e o dispositivo complementar do Windows Hello através da utilização de authkey e HMAC no 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 a clonagem do dispositivo complementar do Windows Hello
- Fornecer proteção contra escutas ao enviar chaves HMAC no momento do registro para o PC
- Verifique se o sinal de presença do usuário está disponível