Desbloqueo de Windows con dispositivos complementarios (IoT) Windows Hello

Un dispositivo complementario de Windows Hello es un dispositivo que puede actuar junto con el escritorio de Windows 10 para mejorar la experiencia de autenticación del usuario. Con el marco de dispositivo complementario Windows Hello, un dispositivo complementario puede proporcionar una experiencia enriquecida para Windows Hello, incluso cuando no hay disponible biometría (por ejemplo, si el dispositivo de escritorio con Windows 10 no tiene una cámara para la autenticación facial o un dispositivo lector de huellas digitales).

Nota:

La API para el marco de dispositivos complementarios Windows Hello está en desuso en Windows 10, versión 2004.

Introducción

Para obtener ejemplos de código, consulte el repositorio GitHub del marco de dispositivo complementario Windows Hello.

Casos de uso

Hay muchas maneras de usar el marco de dispositivo complementario Windows Hello para crear una excelente experiencia de desbloqueo de Windows con un dispositivo complementario. Por ejemplo, los usuarios podrían:

  • Conectar su dispositivo complementario al PC a través de USB, tocar el botón en el dispositivo complementario y desbloquear automáticamente su PC.
  • Llevar un teléfono en su bolsillo que ya está emparejado con el PC a través de Bluetooth. Al pulsar la barra espaciadora en su PC, el teléfono recibe una notificación. Al aprobarla, el PC simplemente se desbloquea.
  • Colocar su dispositivo complementario junto a un lector NFC para desbloquear rápidamente su PC.
  • Usar una pulsera de actividad física que ya ha autenticado al usuario. Después de acercarse al PC, y realizando un gesto especial (como una palmada), el PC se desbloquea.

Dispositivos complementarios Windows Hello habilitados para biometría

Si el dispositivo complementario admite biometría, en algunos casos, el Marco biométrico de Windows puede ser una solución mejor que el marco de dispositivo complementario Windows Hello.

Componentes de la solución

En el diagrama siguiente se muestran los componentes de la solución y quién es responsable de compilarlos.

información general del marco

El marco de dispositivo complementario Windows Hello se implementa como un servicio que se ejecuta en Windows (denominado Servicio de autenticación complementaria en este artículo). Este servicio es responsable de generar un token de desbloqueo que debe protegerse mediante una clave HMAC almacenada en el dispositivo complementario Windows Hello. Esto garantiza que el acceso al token de desbloqueo requiere la presencia del dispositivo complementario Windows Hello. Por cada tupla (PC, usuario de Windows), habrá un token de desbloqueo único.

La integración con el Marco de dispositivo complementario Windows Hello requiere:

  • Una aplicación de dispositivo complementario Windows Hello de Plataforma universal de Windows (UWP) para el dispositivo complementario, descargada desde la tienda de aplicaciones de Windows.
  • La capacidad de crear dos claves HMAC de 256 bits en el dispositivo complementario Windows Hello y generar HMAC con ella (mediante SHA-256).
  • Configuración de seguridad en el dispositivo de escritorio de Windows 10 configurado correctamente. El Servicio de autenticación complementaria requerirá que este PIN se configure previamente para que se pueda conectar cualquier dispositivo complementario Windows Hello. Los usuarios deben configurar un PIN a través de Configuración > Cuentas > Opciones de inicio de sesión.

Además de los requisitos anteriores, la aplicación de dispositivo complementario Windows Hello es responsable de:

  • Experiencia del usuario y personalización de marca del registro inicial y posteriormente el registro del dispositivo complementario Windows Hello.
  • Ejecutarse en segundo plano, detectar el dispositivo complementario Windows Hello, comunicarse con el dispositivo complementario Windows Hello y también del Servicio de autenticación complementaria.
  • Control de errores

Normalmente, los dispositivos complementarios se envían con una aplicación para la configuración inicial, como configurar una pulsera de actividad física por primera vez. La funcionalidad descrita en este documento puede formar parte de esa aplicación y no debería ser necesaria una aplicación independiente.

Señales de usuario

Cada dispositivo complementario Windows Hello debe combinarse con una aplicación que admita tres señales de usuario. Estas señales pueden ser en forma de acción o de gesto.

  • Señal de intención: permite al usuario mostrar su intención de desbloqueo, por ejemplo, pulsando un botón en el dispositivo complementario Windows Hello. La señal de intención debe recopilarse en el lado del dispositivo complementario Windows Hello.
  • Señal de presencia del usuario: demuestra la presencia del usuario. El dispositivo complementario Windows Hello podría requerir, por ejemplo, un PIN antes para que se pueda usar para desbloquear el PC (no confundir con el PIN del PC) o puede requerir presionar un botón.
  • Señal de desambiguación: desambigua el equipo de escritorio Windows 10 que el usuario quiere desbloquear cuando hay varias opciones disponibles para el dispositivo complementario Windows Hello.

Cualquier cantidad de estas señales de usuario se puede combinar en una sola. Las señales de presencia e intención del usuario deben ser necesarias en cada uso.

Registro y comunicación futura entre un PC y dispositivos complementarios Windows Hello

Para que un dispositivo complementario Windows Hello se pueda conectar al marco de dispositivo complementario Windows Hello, debe registrarse con el marco. La experiencia de registro es propiedad completa de la aplicación de dispositivo complementario Windows Hello.

La relación entre el dispositivo complementario Windows Hello y el dispositivo de escritorio Windows 10 puede ser uno a varios (es decir, un dispositivo complementario se puede usar para muchos dispositivos de escritorio Windows 10). Sin embargo, cada dispositivo complementario Windows Hello solo se puede usar para un usuario en cada dispositivo de escritorio Windows 10.

Antes de que un dispositivo complementario Windows Hello pueda comunicarse con un PC, ambos deben acordar el transporte que se va a usar. Esta elección se deja a la aplicación de dispositivo complementario Windows Hello; el marco de dispositivo complementario Windows Hello no impone ninguna limitación en el tipo de transporte (USB, NFC, WiFi, BT, BLE, etc.) o el protocolo que se usa entre el dispositivo complementario Windows Hello y la aplicación de dispositivo complementario Windows Hello en el lado del dispositivo de escritorio Windows 10. Sin embargo, sugiere ciertas consideraciones de seguridad para la capa de transporte, tal como se describe en la sección "Requisitos de seguridad" de este documento. Es responsabilidad del proveedor del dispositivo proporcionar esos requisitos. El marco no los proporciona.

Modelo de interacción del usuario

Detección, instalación y primer registro de aplicación de dispositivo complementario Windows Hello

Un flujo de trabajo de usuario típico es el siguiente:

  • El usuario configura el PIN en cada uno de los dispositivos de escritorio Windows 10 de destino que quiere desbloquear con ese dispositivo complementario Windows Hello.
  • El usuario ejecuta la aplicación de dispositivo complementario Windows Hello en su dispositivo de escritorio Windows 10 para registrar su dispositivo complementario Windows Hello con el equipo de escritorio Windows 10.

Notas:

  • Se recomienda que la detección, descarga e inicio de la aplicación de dispositivo complementario Windows Hello se optimice y, si es posible, se automatice (por ejemplo, la aplicación se puede descargar al situar el dispositivo complementario Windows Hello junto a un lector NFC en el lado del dispositivo de escritorio Windows 10). Sin embargo, es responsabilidad del dispositivo complementario Windows Hello y de la aplicación de dispositivo complementario Windows Hello.
  • En un entorno empresarial, la aplicación de dispositivo complementario Windows Hello se puede implementar a través de MDM.
  • La aplicación de dispositivo complementario Windows Hello es responsable de mostrar al usuario los mensajes de error que se producen como parte del registro.

Protocolo de registro y cancelación de registro

En el diagrama siguiente se muestra cómo interactúa el dispositivo complementario Windows Hello con el Servicio de autenticación complementaria durante el registro.

Diagrama del flujo de registro.

En nuestro protocolo se usan dos claves:

  • Clave de dispositivo (devicekey): se usa para proteger los tokens de desbloqueo que el equipo necesita para desbloquear Windows.
  • Clave de autenticación (authkey): se usa para autenticar mutuamente el dispositivo complementario Windows Hello y el Servicio de autenticación complementaria.

La clave de dispositivo y las claves de autenticación se intercambian en el momento del registro entre la aplicación de dispositivo complementario Windows Hello y el dispositivo complementario Windows Hello. Como resultado, la aplicación de dispositivo complementario Windows Hello y el dispositivo complementario Windows Hello deben usar un transporte seguro para proteger las claves.

Además, tenga en cuenta que, aunque en el diagrama anterior se muestran dos claves HMAC que se generan en el dispositivo complementario Windows Hello, también es posible que la aplicación las genere y las envíe al dispositivo complementario Windows Hello para su almacenamiento.

Inicio de flujos de autenticación

Hay dos maneras de que el usuario inicie el flujo de inicio de sesión en el equipo de escritorio Windows 10 mediante el marco del dispositivo complementario Windows Hello (es decir, proporcionar la señal de intención):

  • Abrir la tapa en el portátil o presionar la barra espaciadora o deslizar el dedo hacia arriba en el PC.
  • Realizar un gesto o una acción en el lado del dispositivo complementario Windows Hello.

El dispositivo complementario Windows Hello selecciona cuál es el punto de partida. El marco del dispositivo complementario Windows Hello informará a la aplicación de dispositivo complementario cuando se elija la opción uno. Para la opción dos, la aplicación de dispositivo complementario Windows Hello debe consultar el dispositivo complementario para ver si ese evento se ha capturado. Esto garantiza que el dispositivo complementario Windows Hello recopila la señal de intención antes de que el desbloqueo se realice correctamente.

Proveedor de credenciales del dispositivo complementario Windows Hello

Hay un nuevo proveedor de credenciales en Windows 10 que controla todos los dispositivos complementarios Windows Hello.

El proveedor de credenciales del dispositivo complementario Windows Hello es responsable de iniciar la tarea en segundo plano del dispositivo complementario mediante la activación de un desencadenador. El desencadenador se establece la primera vez que se activa el PC y se muestra una pantalla de bloqueo. La segunda vez es cuando el PC entra en la interfaz de usuario de inicio de sesión y el proveedor de credenciales de dispositivo complementario Windows Hello es el icono seleccionado.

La biblioteca auxiliar de la aplicación del dispositivo complementario Windows Hello escuchará el cambio de estado de la pantalla de bloqueo y enviará el evento correspondiente a la tarea en segundo plano del dispositivo complementario Windows Hello.

Si hay varias tareas en segundo plano del dispositivo complementario Windows Hello, la primera tarea en segundo plano que ha finalizado el proceso de autenticación desbloqueará el PC. El servicio de autenticación del dispositivo complementario omitirá las llamadas de autenticación restantes.

La experiencia en el lado del dispositivo complementario Windows Hello es propiedad de la aplicación del dispositivo complementario Windows Hello y es esta la que la administra. El marco del dispositivo complementario Windows Hello no tiene control sobre esta parte de la experiencia del usuario. Más concretamente, el proveedor de autenticación complementaria informa a la aplicación de dispositivo complementario Windows Hello (a través de su aplicación en segundo plano) sobre los cambios de estado en la interfaz de usuario de inicio de sesión (por ejemplo, la pantalla de bloqueo acaba de bajar o el usuario acaba de disipar la pantalla de bloqueo pulsando la barra espaciadora) y es responsabilidad de la aplicación de dispositivo complementario Windows Hello crear una experiencia alrededor de eso (por ejemplo, cuando el usuario presiona la barra espaciadora y disipa la pantalla de desbloqueo, comienza a buscar el dispositivo a través de USB).

El marco del dispositivo complementario de Windows Hello proporcionará un stock de texto (localizado) y mensajes de error para que la aplicación de dispositivo complementario Windows Hello elija. Los textos se mostrarán en la parte superior de la pantalla de bloqueo (o en la interfaz de usuario de inicio de sesión). Consulte la sección Tratamiento de mensajes y errores para obtener más detalles.

Protocolo de autenticación

Una vez iniciada la tarea en segundo plano asociada a una aplicación de dispositivo complementario Windows Hello, es responsable de pedir al dispositivo complementario Windows Hello que valide un valor HMAC calculado por el Servicio de autenticación complementaria y ayude a calcular dos valores HMAC:

  • Validar el HMAC de servicio = HMAC(authentication key, service nonce || device nonce || session nonce).
  • Calcular el HMAC de la clave del dispositivo con un valor nonce.
  • Calcular el HMAC de la clave de autenticación con el primer valor HMAC concatenado con un nonce generado por el Servicio de autenticación complementaria.

El servicio usa el segundo valor calculado para autenticar el dispositivo y también evitar ataques de reproducción en el canal de transporte.

Diagrama del flujo de registro actualizado.

Administración del ciclo de vida

Registrar una vez, usar en todas partes

Sin un servidor back-end, los usuarios deben registrar su dispositivo complementario Windows Hello con cada dispositivo de escritorio Windows 10 por separado.

Un proveedor de dispositivo complementario u OEM puede implementar un servicio web para la itinerancia del estado de registro entre dispositivos móviles o de escritorio Windows 10 de usuario. Para obtener más información, consulte la sección Servicio de itinerancia, revocación y filtro.

PIN management

Para poder usar un dispositivo complementario, es necesario configurar un PIN en el dispositivo de escritorio Windows 10. Esto garantiza que el usuario tenga una copia de seguridad en caso de que su dispositivo complementario Windows Hello no funcione. El PIN es algo que Windows administra y que las aplicaciones nunca ven. Para cambiarlo, el usuario navega a Configuración > Cuentas > Opciones de inicio de sesión.

Administración y directiva

Los usuarios pueden quitar un dispositivo complementario Windows Hello de un dispositivo de escritorio Windows 10 ejecutando la aplicación de dispositivo complementario Windows Hello en ese dispositivo de escritorio.

Las empresas tienen dos opciones para controlar el marco del dispositivo complementario Windows Hello:

  • Activar o desactivar la característica
  • Definir la lista de permitidos de los dispositivos complementarios Windows Hello permitidos mediante AppLocker de Windows

El marco del dispositivo complementario Windows Hello no admite ninguna manera centralizada de mantener el inventario de los dispositivos complementarios disponibles o un método para filtrar aún más qué instancias de un tipo de dispositivo complementario Windows Hello se permiten (por ejemplo, solo se permite un dispositivo complementario con un número de serie entre X e Y). Sin embargo, los desarrolladores de aplicaciones pueden crear un servicio para proporcionar dicha funcionalidad. Para obtener más información, consulte la sección Servicio de itinerancia, revocación y filtro.

Revocación

El marco del dispositivo complementario Windows Hello no admite la eliminación remota de un dispositivo complementario de un dispositivo de escritorio Windows 10 específico. En su lugar, los usuarios pueden quitar el dispositivo complementario Windows Hello a través de la aplicación de dispositivo complementario Windows Hello que se ejecuta en ese dispositivo de escritorio Windows 10.

Sin embargo, los proveedores de dispositivos complementarios pueden crear un servicio para proporcionar funcionalidad de revocación remota. Para obtener más información, consulte la sección Servicio de itinerancia, revocación y filtrado.

Servicios de itinerancia y filtrado

Los proveedores de dispositivos complementarios pueden implementar un servicio web que se pueda usar para los escenarios siguientes:

  • Un servicio de filtrado para empresas: una empresa puede limitar el conjunto de dispositivos complementarios Windows Hello que pueden funcionar en su entorno para seleccionar algunos de un proveedor específico. Por ejemplo, la empresa Contoso podría pedir 10 000 dispositivos complementarios Modelo Y del Proveedor X y asegurarse de que solo esos dispositivos funcionarán en el dominio Contoso (y no ningún otro modelo de dispositivo del Proveedor X).
  • Inventario: una empresa puede determinar la lista de dispositivos complementarios existentes usados en un entorno empresarial.
  • Revocación en tiempo real: si un empleado informa del robo o la pérdida de su dispositivo complementario, el servicio web se puede usar para revocar ese dispositivo.
  • Itinerancia: un usuario solo tiene que registrar su dispositivo complementario una vez y funciona en todos sus dispositivos móviles y de escritorio Windows 10.

La implementación de estas características requiere que la aplicación de dispositivo complementario Windows Hello compruebe con el servicio web durante el registro y el tiempo de uso. La aplicación de dispositivo complementario Windows Hello puede optimizar para escenarios de inicio de sesión almacenados en caché, como requerir la comprobación con el servicio web solo una vez al día (a costa de extender el tiempo de revocación hasta un día).

Modelo de API del marco del dispositivo complementario Windows Hello

Información general

Una aplicación de dispositivo complementario Windows Hello debe contener dos componentes: una aplicación en primer plano con la interfaz de usuario responsable de registrar y anular el registro del dispositivo, y una tarea en segundo plano que controla la autenticación.

El flujo general de la API es el siguiente:

  1. Registrar el dispositivo complementario Windows Hello
    • Asegurarse de que el dispositivo está cerca y consultar su funcionalidad (si es necesario)
    • Generar dos claves HMAC (ya sea en el lado del dispositivo complementario o de la aplicación)
    • Llamar a RequestStartRegisteringDeviceAsync
    • Llamar a FinishRegisteringDeviceAsync
    • Asegurarse de que la aplicación de dispositivo complementario Windows Hello almacena las claves HMAC (si se admite) y la aplicación de dispositivo complementario Windows Hello descarta sus copias
  2. Registrar la tarea en segundo plano
  3. Esperar al evento correcto en la tarea en segundo plano
    • WaitingForUserConfirmation: esperar a este evento si se requiere la acción o el gesto del usuario en el lado del dispositivo complementario Windows Hello para iniciar el flujo de autenticación
    • CollectingCredential: esperar a este evento si el dispositivo complementario Windows Hello necesita la acción o el gesto del usuario en el PC para iniciar el flujo de autenticación (por ejemplo, si se presiona la barra espaciadora)
    • Otro desencadenador, como una tarjeta inteligente: asegurarse de consultar el estado de autenticación actual para llamar a las API correctas.
  4. Mantener informado al usuario sobre los mensajes de error o los pasos siguientes necesarios llamando a ShowNotificationMessageAsync. Llamar solo a esta API una vez que se recopile una señal de intención
  5. Desbloquear
    • Asegurar que se recopilaron las señales de intención y presencia del usuario
    • Llamar a StartAuthenticationAsync
    • Comunicarse con el dispositivo complementario para realizar operaciones HMAC necesarias
    • Llamar a FinishAuthenticationAsync
  6. Anular el registro de un dispositivo complementario Windows Hello cuando el usuario lo solicita (por ejemplo, si se ha perdido el dispositivo complementario)
    • Enumerar el dispositivo complementario Windows Hello para el usuario que ha iniciado sesión a través de FindAllRegisteredDeviceInfoAsync
    • Anular el registro mediante UnregisterDeviceAsync

Registro y cancelación del registro

El registro requiere dos llamadas API al Servicio de autenticación complementaria: RequestStartRegisteringDeviceAsync y FinishRegisteringDeviceAsync.

Antes de realizar cualquiera de estas llamadas, la aplicación de dispositivo complementario Windows Hello debe asegurarse de que el dispositivo complementario Windows Hello esté disponible. Si el dispositivo complementario Windows Hello es responsable de generar claves HMAC (claves de autenticación y de dispositivo), la aplicación de dispositivo complementario Windows Hello también debe pedir al dispositivo complementario que los genere antes de realizar cualquiera de las dos llamadas anteriores. Si la aplicación de dispositivo complementario Windows Hello es responsable de generar claves HMAC, debe hacerlo antes de realizar las dos llamadas anteriores.

Además, como parte de la primera llamada a la API (RequestStartRegisteringDeviceAsync), la aplicación de dispositivo complementario Windows Hello debe decidir la funcionalidad del dispositivo y estar preparada para pasarla como parte de la llamada a la API; por ejemplo, si el dispositivo complementario Windows Hello admite almacenamiento seguro para las claves HMAC. Si la misma aplicación de dispositivo complementario Windows Hello se usa para administrar varias versiones del mismo dispositivo complementario y esas funcionalidades cambian (y requiere que una consulta de dispositivo decida), se recomienda que estas consultas se produzcan antes de que se realice la primera llamada a la API.

La primera API (RequestStartRegisteringDeviceAsync) devolverá un identificador usado por la segunda API (FinishRegisteringDeviceAsync). La primera llamada de registro iniciará la solicitud del PIN para asegurar que el usuario está presente. Si no se configura ningún PIN, se producirá un error en esta llamada. La aplicación de dispositivo complementario Windows Hello también puede consultar si el PIN está configurado o no a través de la llamada KeyCredentialManager.IsSupportedAsync. La llamada RequestStartRegisteringDeviceAsync también puede producir un error si la directiva ha deshabilitado el uso del dispositivo complementario Windows Hello.

El resultado de la primera llamada se devuelve mediante la enumeración 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
}

La segunda llamada (FinishRegisteringDeviceAsync) finaliza el registro. Como parte del proceso de registro, la aplicación de dispositivo complementario Windows Hello puede almacenar datos de configuración del dispositivo complementario con el Servicio de autenticación complementaria. Hay un límite de tamaño de 4000 para estos datos. Estos datos estarán disponibles para la aplicación de dispositivo complementario Windows Hello en el momento de la autenticación. Estos datos se pueden usar, por ejemplo, para conectarse al dispositivo complementario Windows Hello como una dirección MAC, o si el dispositivo complementario Windows Hello no tiene almacenamiento y el dispositivo complementario quiere usar el PC para el almacenamiento, se pueden usar los datos de configuración. Tenga en cuenta que los datos confidenciales almacenados como parte de los datos de configuración deben cifrarse con una clave que solo conozca el dispositivo complementario Windows Hello. Además, dado que un servicio de Windows almacena los datos de configuración, está disponible para la aplicación de dispositivo complementario Windows Hello en todos los perfiles de usuario.

La aplicación de dispositivo complementario Windows Hello puede llamar a AbortRegisteringDeviceAsync para cancelar el registro y pasar un código de error. El Servicio de autenticación complementaria registrará el error en los datos de telemetría. Un buen ejemplo de esta llamada sería cuando ha habido un problema con el dispositivo complementario Windows Hello y no ha podido finalizar el registro (por ejemplo, no puede almacenar claves HMAC o se ha perdido la conexión BT).

La aplicación de dispositivo complementario Windows Hello debe proporcionar una opción para que el usuario anule el registro de su dispositivo complementario Windows Hello desde su dispositivo de escritorio Windows 10 (por ejemplo, si perdió su dispositivo complementario o compró una versión más reciente). Cuando el usuario selecciona esa opción, la aplicación de dispositivo complementario Windows Hello debe llamar a UnregisterDeviceAsync. Esta llamada de la aplicación de dispositivo complementario Windows Hello desencadenará el servicio de autenticación de dispositivo complementario para eliminar todos los datos (incluidas las claves HMAC) correspondientes al identificador de dispositivo específico y el AppId de la aplicación de llamada desde el PC. Esta llamada de la API no intenta eliminar las claves HMAC desde el lado de la aplicación de dispositivo complementario Windows Hello o del dispositivo complementario. Esto se implementará en la aplicación de dispositivo complementario Windows Hello.

La aplicación de dispositivo complementario Windows Hello es responsable de mostrar los mensajes de error que se producen en la fase de registro y anulación 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);
		}
	}
}

Autenticación

La autenticación requiere dos llamadas a la API al Servicio de autenticación complementaria: StartAuthenticationAsync y FinishAuthencationAsync.

La primera API de inicio devolverá un identificador usado por la segunda API. La primera llamada devuelve, entre otras cosas, un nonce que, una vez concatenado con otras cosas, se debe transformar en HMAC con la clave del dispositivo almacenada en el dispositivo complementario Windows Hello. La segunda llamada devuelve los resultados de HMAC con la clave del dispositivo y puede terminar con la autenticación correcta (es decir, el usuario verá su escritorio).

La primera API de inicio (StartAuthenticationAsync) puede producir un error si la directiva ha deshabilitado ese dispositivo complementario de Windows Hello después del registro inicial. También puede producir un error si la llamada API se realizó fuera de los estados WaitingForUserConfirmation o CollectingCredential (descritos más adelante en esta sección). También puede producir un error si una aplicación de dispositivo complementario no registrada la llama. La enumeración SecondaryAuthenticationFactorAuthenticationStatus resume los posibles resultados:

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

La segunda llamada API (FinishAuthencationAsync) puede producir un error si el nonce que se proporcionó en la primera llamada ha expirado (20 segundos). La enumeración SecondaryAuthenticationFactorFinishAuthenticationStatus captura posibles resultados.

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

El tiempo de dos llamadas API (StartAuthenticationAsync y FinishAuthencationAsync) debe alinearse con el modo en que el dispositivo complementario de Windows Hello recopila las señales de intención, presencia del usuario y desambiguación (consulte Señales de usuario para obtener más detalles). Por ejemplo, la segunda llamada no debe enviarse hasta que la señal de intención esté disponible. En otras palabras, el PC no debe desbloquearse si el usuario no ha expresado su intención. Para aclarar, supongamos que la proximidad de Bluetooth se usa para el desbloqueo de PC; entonces se debe recopilar una señal de intención explícita, porque de lo contrario, tan pronto como el usuario se aleje de su PC para ir a la cocina, el PC se desbloqueará. Además, el nonce devuelto desde la primera llamada es el límite de tiempo (20 segundos) y expirará después de un período determinado. Como resultado, la primera llamada solo debe realizarse cuando la aplicación del dispositivo complementario de Windows Hello tiene una buena indicación de la presencia del dispositivo complementario, por ejemplo, el dispositivo complementario se inserta en el puerto USB o se acerca al lector NFC. Con Bluetooth, se debe tener cuidado para evitar que afecte a la batería del PC o a otras actividades de Bluetooth que se produzcan en ese momento al comprobar la presencia del dispositivo complementario de Windows Hello. Además, si es necesario proporcionar una señal de presencia del usuario (por ejemplo, escribiendo el PIN), se recomienda que la primera llamada de autenticación solo se realice después de recopilar esa señal.

El marco del dispositivo complementario de Windows Hello ayuda a la aplicación del dispositivo complementario de Windows Hello a tomar decisiones informadas sobre cuándo realizar las dos llamadas anteriores proporcionando una imagen completa de dónde está el usuario en el flujo de autenticación. El marco del dispositivo complementario de Windows Hello proporciona esta funcionalidad proporcionando una notificación de cambio de estado de bloqueo a la tarea en segundo plano de la aplicación.

flujo de dispositivo complementario

Los detalles de cada uno de estos estados son los siguientes:

Estado Descripción
WaitingForUserConfirmation Este evento de notificación de cambio de estado se desencadena cuando aparece la pantalla de bloqueo (por ejemplo, el usuario presiona Windows + L). Se recomienda no solicitar ningún mensaje de error relacionado con tener dificultades para encontrar un dispositivo en este estado. En general, se recomienda mostrar solo mensajes cuando la señal de intención esté disponible. La aplicación del dispositivo complementario de Windows Hello debe realizar la primera llamada a la API para la autenticación en este estado si el dispositivo complementario recopila la señal de intención (por ejemplo, tocar el lector NFC, presionar un botón en el dispositivo complementario o realizar un gesto específico, como aplaudir) y la tarea en segundo plano de la aplicación del dispositivo complementario de Windows Hello recibe la indicación del dispositivo complementario que se detectó la señal de intención. De lo contrario, si la aplicación del dispositivo complementario de Windows Hello se basa en el equipo para iniciar el flujo de autenticación (haciendo que el usuario deslice la pantalla de desbloqueo o presione la barra espaciadora), la aplicación del dispositivo complementario de Windows Hello debe esperar al siguiente estado (CollectingCredential).
CollectingCredential Este evento de notificación de cambio de estado se desencadena cuando el usuario abre la tapa del portátil, pulsa cualquier tecla en el teclado o desliza el dedo hacia arriba hasta la pantalla de desbloqueo. Si el dispositivo complementario de Windows Hello se basa en las acciones anteriores para empezar a recopilar la señal de intención, la aplicación del dispositivo complementario de Windows Hello debería empezar a recopilarlo (por ejemplo, a través de un elemento emergente en el dispositivo complementario que pregunta si el usuario quiere desbloquear el equipo). Este sería un buen momento para proporcionar casos de error si la aplicación del dispositivo complementario de Windows Hello necesita que el usuario proporcione una señal de presencia del usuario en el dispositivo complementario (como escribir el PIN en el dispositivo complementario de Windows Hello).
SuspendingAuthentication Cuando la aplicación del dispositivo complementario de Windows Hello recibe este estado, significa que el servicio de autenticación complementaria ha dejado de aceptar solicitudes de autenticación.
CredentialCollected Esto significa que otra aplicación de dispositivo complementario de Windows Hello ha llamado a la segunda API y que el servicio de autenticación complementaria está comprobando lo que se envió. En este momento, el servicio de autenticación complementaria no acepta ninguna otra solicitud de autenticación a menos que la enviada actualmente no supere la comprobación. La aplicación del dispositivo complementario de Windows Hello debe mantenerse atenta hasta que se alcance el siguiente estado.
CredentialAuthenticated Esto significa que la credencial enviada funcionó. CredentialAuthenticated tiene el identificador de dispositivo del dispositivo complementario de Windows Hello que se realizó correctamente. La aplicación del dispositivo complementario de Windows Hello debe asegurarse de comprobarlo para ver si el dispositivo asociado fue el ganador. Si no es así, la aplicación del dispositivo complementario de Windows Hello debe evitar mostrar los flujos posteriores a la autenticación (como el mensaje correcto en el dispositivo complementario o quizás una vibración en ese dispositivo). Tenga en cuenta que si la credencial enviada no funcionó, el estado cambiará a CollectingCredential.
StoppingAuthentication La autenticación se realizó correctamente y el usuario vio el escritorio. Hora de matar la tarea en segundo plano. Antes de salir de la tarea en segundo plano, anule explícitamente el registro del controlador StageEvent. Esto ayudará a que la tarea en segundo plano salga rápidamente.

Las aplicaciones del dispositivo complementario de Windows Hello solo deben llamar a las dos API de autenticación en los dos primeros estados. Las aplicaciones del dispositivo complementario de Windows Hello deben comprobar el escenario en el que se desencadena este evento. Hay dos posibilidades: desbloquear o publicar el desbloqueo. Actualmente, solo se admite el desbloqueo. En próximas versiones, se pueden admitir escenarios posteriores al desbloqueo. La enumeración SecondaryAuthenticationFactorAuthenticationScenario captura estas dos opciones:

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

Ejemplo con todo el código:

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 una tarea en segundo plano

Cuando la aplicación del dispositivo complementario de Windows Hello registra el primer dispositivo complementario, también debe registrar su componente de tarea en segundo plano que pasará información de autenticación entre el dispositivo y el servicio de autenticación de dispositivo complementario.

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

Errores y mensajes

El marco del dispositivo complementario de Windows Hello es responsable de proporcionar comentarios al usuario sobre el éxito o error del inicio de sesión. El marco del dispositivo complementario de Windows Hello proporcionará un stock de texto (localizado) y mensajes de error para que la aplicación de dispositivo complementario de Windows Hello elija. Se mostrarán en la interfaz de usuario de inicio de sesión.

error del dispositivo complementario

Las aplicaciones del dispositivo complementario de Windows Hello pueden usar ShowNotificationMessageAsync para mostrar mensajes al usuario como parte de la interfaz de usuario de inicio de sesión. Llame a esta API cuando haya disponible una señal de intención. Tenga en cuenta que una señal de intención siempre debe recopilarse en el lado del dispositivo complementario de Windows Hello.

Hay dos tipos de mensajes: orientación y errores.

Los mensajes de orientación están diseñados para mostrar al usuario cómo iniciar el proceso de desbloqueo. Estos mensajes solo se muestran al usuario una vez en la pantalla de bloqueo, tras el primer registro del dispositivo, y nunca se vuelven a mostrar allí. Estos mensajes seguirán mostrándose en la pantalla de bloqueo.

Los mensajes de error siempre se muestran y se mostrarán después de proporcionar una señal de intención. Dado que se debe recopilar una señal de intención antes de mostrar los mensajes al usuario, y el usuario proporcionará esa intención solo con uno de los dispositivos complementarios de Windows Hello, no debe haber ninguna situación en la que varios dispositivos complementarios de Windows Hello compitan para mostrar mensajes de error. Como resultado, el marco del dispositivo complementario de Windows Hello no mantiene ninguna cola. Cuando un autor de llamada solicita un mensaje de error, se mostrará durante 5 segundos y se quitarán todas las demás solicitudes para mostrar un mensaje de error en esos 5 segundos. Una vez transcurridos los 5 segundos, surge la oportunidad para que otro autor de llamada muestre un mensaje de error. Prohibimos que cualquier autor de llamada atasque el canal de error.

Los mensajes de orientación y de error son los siguientes. El nombre del dispositivo es un parámetro pasado por la aplicación de dispositivo complementario como parte de ShowNotificationMessageAsync.

Guía

  • "Deslice hacia arriba o presione la barra espaciadora para iniciar sesión con el nombre del dispositivo".
  • "Configurando el dispositivo complementario. Espere o use otra opción de inicio de sesión".
  • "Acerque nombre del dispositivo al lector NFC para iniciar sesión".
  • "Buscando nombre del dispositivo..."
  • "Conecte nombre del dispositivo a un puerto USB para iniciar sesión".

Errores

  • "Consulte nombre del dispositivo para obtener instrucciones de inicio de sesión".
  • "Active Bluetooth para usar nombre del dispositivo para iniciar sesión".
  • "Active NFC para usar nombre del dispositivo para iniciar sesión".
  • "Conéctese a una red Wi-Fi para usar nombre del dispositivo para iniciar sesión".
  • "Toque nombre del dispositivo de nuevo."
  • "Su empresa impide el inicio de sesión con nombre del dispositivo. Use otra opción de inicio de sesión".
  • "Pulse nombre del dispositivo para iniciar sesión".
  • "Ponga el dedo en nombre del dispositivo para iniciar sesión".
  • "Deslice el dedo en nombre del dispositivo para iniciar sesión".
  • "No se pudo iniciar sesión con nombre del dispositivo. Use otra opción de inicio de sesión".
  • "Ha habido algún error. Use otra opción de inicio de sesión y vuelva a configurar nombre del dispositivo".
  • "Inténtelo de nuevo."
  • "Diga la frase de contraseña hablada en nombre del dispositivo".
  • "Listo para iniciar sesión con nombre del dispositivo".
  • "Use primero otra opción de inicio de sesión y, a continuación, puede usar nombre del dispositivo para iniciar sesión".

Enumeración de dispositivos registrados

La aplicación del dispositivo complementario de Windows Hello puede enumerar la lista de dispositivos complementarios registrados a través de la llamada FindAllRegisteredDeviceInfoAsync. Esta API admite dos tipos de consulta definidos mediante la enumeración SecondaryAuthenticationFactorDeviceFindScope:

{
	User = 0,
	AllUsers,
}

El primer ámbito devuelve la lista de dispositivos para el usuario que ha iniciado sesión. La segunda devuelve la lista de todos los usuarios de ese PC. El primer ámbito debe usarse en el momento de anular el registro para evitar anular el registro del dispositivo complementario de Windows Hello de otro usuario. La segunda debe usarse en el momento de la autenticación o del registro: en el momento del registro, esta enumeración puede ayudar a la aplicación a evitar intentar registrar el mismo dispositivo complementario de Windows Hello dos veces.

Tenga en cuenta que aunque la aplicación no realice esta comprobación, el equipo sí la hará y rechazará que el mismo dispositivo complementario de Windows Hello se registre más de una vez. En el momento de la autenticación, el uso del ámbito AllUsers ayuda a que la aplicación del dispositivo complementario de Windows Hello admita el cambio de flujo de usuario: inicie sesión en el usuario A cuando el usuario B haya iniciado sesión (esto requiere que ambos usuarios hayan instalado la aplicación del dispositivo complementario de Windows Hello y el usuario A haya registrado sus dispositivos complementarios con el PC y el PC está sobre la pantalla de bloqueo (o la pantalla de inicio de sesión)).

Requisitos de seguridad

El Servicio de autenticación complementaria proporciona las siguientes protecciones de seguridad.

  • El malware en un dispositivo de escritorio con Windows 10 que se ejecuta como un usuario medio o un contenedor de aplicaciones no puede usar el dispositivo complementario de Windows Hello para acceder a las claves de credenciales de usuario (almacenadas como parte de Windows Hello) en un PC de forma silenciosa.
  • Un usuario malintencionado en un dispositivo de escritorio con Windows 10 no puede usar el dispositivo complementario de Windows Hello que pertenece a otro usuario en ese dispositivo de escritorio con Windows 10 para obtener acceso silencioso a sus claves de credenciales de usuario (en el mismo dispositivo de escritorio con Windows 10).
  • El malware en el dispositivo complementario de Windows Hello no puede obtener acceso de forma silenciosa a las claves de credenciales de usuario en un dispositivo de escritorio con Windows 10, incluido el aprovechamiento de la funcionalidad o el código desarrollado específicamente para el marco de dispositivos complementarios de Windows Hello.
  • Un usuario malintencionado no puede desbloquear un dispositivo de escritorio con Windows 10 capturando el tráfico entre el dispositivo complementario de Windows Hello y el dispositivo de escritorio con Windows 10 y reproduciéndolo más adelante. El uso de nonce, authkey y HMAC en nuestro protocolo garantiza la protección contra un ataque de reproducción.
  • El malware o un usuario malintencionado en un PC no fiable no puede usar el dispositivo complementario de Windows Hello para obtener acceso a un PC de usuario honesto. Esto se logra mediante la autenticación mutua entre el Servicio de autenticación complementaria y el dispositivo complementario de Windows Hello mediante el uso de authkey y HMAC en nuestro protocolo.

La clave para lograr las protecciones de seguridad enumeradas anteriormente es proteger las claves HMAC del acceso no autorizado y también comprobar la presencia del usuario. Más concretamente, debe cumplir estos requisitos:

  • Proporcionar protección contra la clonación del dispositivo complementario de Windows Hello
  • Proporcionar protección contra la interceptación al enviar claves HMAC en el momento del registro al PC
  • Asegúrese de que la señal de presencia del usuario esté disponible