Sblocco di Windows con i dispositivi (IoT) complementari Windows Hello

Un dispositivo complementare Windows Hello è un dispositivo che può agire in combinazione con Windows 10 desktop per migliorare l'esperienza di autenticazione dell'utente. Grazie al framework del dispositivo complementare Windows Hello, un dispositivo complementare può offrire un'esperienza completa per Windows Hello anche quando i dati biometrici non sono disponibili, ad esempio se il dispositivo desktop Windows 10 non include una fotocamera per l'autenticazione con il viso o un lettore di impronte digitali.

Nota

L'API per il framework del dispositivo complementare Windows Hello è deprecata in Windows 10 versione 2004.

Introduzione

Per esempi di codice, vedere il repository GitHub del dispositivo complementare di Windows Hello.

Casi d'uso

Esistono diversi modi per usare il framework del dispositivo complementare Windows Hello per creare un'esperienza ottimale di sblocco di Windows con un dispositivo complementare. Ad esempio, gli utenti potrebbero:

  • Collegare il dispositivo complementare al PC tramite USB, toccare il pulsante sul dispositivo complementare e sbloccare automaticamente il PC.
  • Portare un telefono in tasca che sia già associato al PC tramite Bluetooth. Quando si preme la barra spaziatrice sul PC, il telefono riceve una notifica. Approvarla e il PC si sblocca semplicemente.
  • Toccare il dispositivo complementare a un lettore NFC per sbloccare rapidamente il PC.
  • Indossare un fitness band che abbia già autenticato chi lo indossa. Quando si avvicina il PC e si esegue un gesto speciale (ad esempio il clapping), il PC si sblocca.

Dispositivi complementari Windows Hello abilitati per la biometria

Se il dispositivo complementare supporta la biometria, in alcuni casi il framework biometrico di Windows potrebbe essere una soluzione migliore rispetto al framework del dispositivo complementare Windows Hello.

Componenti della soluzione

Il diagramma seguente illustra i componenti della soluzione e chi è responsabile della loro compilazione.

panoramica del framework

Il framework del dispositivo complementare Windows Hello viene implementato come servizio in esecuzione in Windows (denominato Servizio di autenticazione complementare in questo articolo). Questo servizio è responsabile della generazione di un token di sblocco che deve essere protetto da una chiave HMAC archiviata nel dispositivo complementare Windows Hello. Ciò garantisce che l'accesso al token di sblocco richieda la presenza del dispositivo complementare Windows Hello. Per ogni tupla (PC, utente Di Windows) sarà presente un token di sblocco univoco.

L'integrazione con Windows Hello Companion Device Framework richiede:

  • Un'app del dispositivo complementare Windows Hello UWP (Universal Windows Platform) per il dispositivo complementare, scaricata dall'App Store di Windows.
  • Possibilità di creare due chiavi HMAC a 256 bit nel dispositivo complementare Windows Hello e generare HMAC con esso (usando SHA-256).
  • Impostazioni di sicurezza sul Windows 10 desktop configurate correttamente. Il servizio di autenticazione complementare richiederà che questo PIN venga configurato prima che qualsiasi dispositivo complementare Windows Hello possa essere collegato. Gli utenti devono configurare un PIN tramite le opzioni di accesso degli > Accounts > Impostazioni.

Oltre ai requisiti precedenti, l'app del dispositivo complementare Windows Hello è responsabile di:

  • Esperienza utente e personalizzazione della registrazione iniziale e successiva de-registrazione del dispositivo complementare Windows Hello.
  • In esecuzione in background, individuazione del dispositivo complementare Windows Hello, comunicazione con il dispositivo complementare Windows Hello e servizio di autenticazione complementare.
  • Gestione degli errori

Normalmente, i dispositivi complementari vengono forniti con un'app per la configurazione iniziale, ad esempio la configurazione di un fitness band per la prima volta. La funzionalità descritta in questo documento può far parte di tale app e non deve essere necessaria un'app separata.

Segnali utente

Ogni dispositivo complementare Windows Hello deve essere combinato con un'app che supporta tre segnali utente. Questi segnali possono essere sotto forma di azione o movimento.

  • Segnale intento: consente all'utente di visualizzare la finalità di sblocco, ad esempio premendo un pulsante nel dispositivo complementare Windows Hello. Il segnale finalità deve essere raccolto sul lato del dispositivo complementare Windows Hello.
  • Segnale di presenza utente: dimostra la presenza dell'utente. Il dispositivo complementare Windows Hello potrebbe, ad esempio, richiedere un PIN prima che possa essere usato per sbloccare il PC (non dev'essere confuso con il PIN del PC) o potrebbe richiedere la pressione di un pulsante.
  • Segnale di disambiguazione: disambigua quale Desktop di Windows 10 l'utente vuole sbloccare quando sono disponibili più opzioni per il dispositivo complementare Windows Hello.

Qualsiasi numero di questi segnali utente può essere combinato in uno. I segnali di presenza e finalità dell'utente devono essere necessari per ogni uso.

Registrazione e comunicazione futura tra un PC e i dispositivi complementari Windows Hello

Prima che un dispositivo complementare Windows Hello possa essere collegato al framework del dispositivo complementare Windows Hello, deve essere registrato con il framework. L'esperienza per la registrazione è completamente di proprietà dell'app del dispositivo complementare Windows Hello.

La relazione tra il dispositivo complementare Windows Hello e il dispositivo Windows 10 desktop può essere uno-a-molti (ad esempio, un dispositivo complementare può essere usato per molti dispositivi Windows 10 desktop). Tuttavia, ogni dispositivo complementare Windows Hello può essere usato solo per un utente in ogni dispositivo Windows 10 desktop.

Prima che un dispositivo complementare Windows Hello possa comunicare con un PC, è necessario accettare un trasporto da usare. Tale scelta viene lasciata all'app del dispositivo complementare Windows Hello; Il framework del dispositivo complementare Windows Hello non impone alcuna limitazione al tipo di trasporto (USB, NFC, WiFi, BT, BLE e così via) o al protocollo usato tra il dispositivo complementare Windows Hello e l'app del dispositivo complementare Windows Hello sul lato del dispositivo Windows 10 desktop. Tuttavia, suggerisce alcune considerazioni sulla sicurezza per il livello di trasporto, come descritto nella sezione "Requisiti di sicurezza" di questo documento. È responsabilità del provider di dispositivi fornire tali requisiti. Il framework non li fornisce per l'utente.

Modello di interazione utente

Individuazione, installazione e registrazione dell'app del dispositivo complementare Windows Hello

Un tipico flusso di lavoro utente è il seguente:

  • L'utente configura il PIN in ogni dispositivo Windows 10 desktop di destinazione che vuole sbloccare con il dispositivo complementare Windows Hello.
  • L'utente esegue l'app del dispositivo complementare Windows Hello nel dispositivo Windows 10 desktop per registrare il dispositivo complementare Windows Hello con windows 10 desktop.

Note:

  • Si consiglia di individuare, scaricare e avviare l'app del dispositivo complementare Windows Hello che è semplificata e, se possibile, automatizzata (ad esempio, l'app può essere scaricata toccando il dispositivo complementare Windows Hello su un lettore NFC sul lato del dispositivo Windows 10 desktop). Questa è tuttavia la responsabilità del dispositivo complementare Windows Hello e dell'app del dispositivo complementare Windows Hello.
  • In un ambiente aziendale, l'app del dispositivo complementare Windows Hello può essere distribuita tramite MDM.
  • L'app del dispositivo complementare Windows Hello è responsabile della visualizzazione degli eventuali messaggi di errore che si verificano durante la registrazione.

Protocollo di registrazione e de-registrazione

Il diagramma seguente illustra come il dispositivo complementare Windows Hello interagisce con il servizio di autenticazione complementare durante la registrazione.

Diagramma del flusso di registrazione.

Esistono due chiavi usate nel protocollo:

  • Chiave del dispositivo (devicekey): usata per proteggere i token di sblocco necessari al PC per sbloccare Windows.
  • Chiave di autenticazione (authkey): usata per autenticare a vicenda il dispositivo complementare Windows Hello e il servizio di autenticazione complementare.

La chiave del dispositivo e le chiavi di autenticazione vengono scambiate al momento della registrazione tra l'app del dispositivo complementare Windows Hello e il dispositivo complementare Windows Hello. Di conseguenza, l'app del dispositivo complementare Windows Hello e il dispositivo complementare Windows Hello devono usare un trasporto sicuro per proteggere le chiavi.

Si noti anche che, mentre il diagramma precedente visualizza due chiavi HMAC generate nel dispositivo complementare Windows Hello, è anche possibile che l'app le generi e le invii al dispositivo complementare Windows Hello per l'archiviazione.

Avvio dei flussi di autenticazione

Esistono due modi per consentire all'utente di avviare il flusso di accesso al desktop di Windows 10 usando Windows Hello Companion Device Framework (ad esempio, fornire un segnale di finalità):

  • Aprire il coperchio sul portatile o premere la barra spaziatrice o scorrere verso l'alto sul PC.
  • Eseguire un movimento o un'azione sul lato del dispositivo complementare Windows Hello.

È la scelta del dispositivo complementare Windows Hello per selezionare quale è il punto di partenza. Il framework del dispositivo complementare Windows Hello informerà l'app del dispositivo complementare quando si verifica un'opzione. Per l'opzione due, l'app del dispositivo complementare Windows Hello deve eseguire una query sul dispositivo complementare per verificare se l'evento è stato acquisito. In questo modo il dispositivo complementare Windows Hello raccoglie il segnale di intento prima che lo sblocco abbia esito positivo.

Provider di credenziali del dispositivo complementare Windows Hello

In Windows 10 è disponibile un nuovo provider di credenziali che gestisce tutti i dispositivi complementari Windows Hello.

Il provider di credenziali del dispositivo complementare Windows Hello è responsabile dell'avvio dell'attività in background del dispositivo complementare tramite l'attivazione di un trigger. Il trigger viene impostato la prima volta che il PC si risveglia e viene visualizzata una schermata di blocco. La seconda volta è quando il PC immette l'interfaccia utente di accesso e il provider di credenziali del dispositivo complementare Windows Hello è il riquadro selezionato.

La libreria helper per l'app del dispositivo complementare Windows Hello ascolterà la modifica dello stato della schermata di blocco e invierà l'evento corrispondente all'attività in background del dispositivo complementare Windows Hello.

Se sono presenti più attività in background del dispositivo complementare Windows Hello, la prima attività in background che ha completato il processo di autenticazione sbloccherà il PC. Il servizio di autenticazione del dispositivo complementare ignorerà tutte le chiamate di autenticazione rimanenti.

L'esperienza sul lato dispositivo complementare Windows Hello è di proprietà dell'app del dispositivo complementare Windows Hello e gestita da essa. Il framework del dispositivo complementare Windows Hello non ha alcun controllo su questa parte dell'esperienza utente. In particolare, il provider di autenticazione complementare informa l'app del dispositivo complementare Windows Hello (tramite la relativa app in background) sulle modifiche dello stato nell'interfaccia utente di accesso (ad esempio, la schermata di blocco è appena stata disattivata o l'utente ha semplicemente rimosso la schermata di blocco premendo la barra spaziatrice) ed è responsabilità dell'app del dispositivo complementare Windows Hello creare un'esperienza intorno ad esso (ad esempio, quando l'utente preme la barra spaziatrice e dispelling schermata di sblocco, iniziare a cercare il dispositivo tramite USB).

Il framework dispositivo complementare Windows Hello fornirà un elenco di testo (localizzato) e messaggi di errore per l'app del dispositivo complementare Windows Hello tra cui scegliere. Questi verranno visualizzati nella parte superiore della schermata di blocco (o nell'interfaccia utente di accesso). Per altri dettagli, vedere la sezione Gestione dei messaggi e degli errori.

Protocollo di autenticazione

Dopo l'avvio dell'attività in background associata a un'app del dispositivo complementare Windows Hello, è responsabile della richiesta al dispositivo complementare Windows Hello di convalidare un valore HMAC calcolato dal servizio di autenticazione complementare e di calcolare due valori HMAC:

  • Validate Service HMAC = HMAC(authentication key, service nonce || device nonce || session nonce).
  • Calcolare il codice HMAC della chiave del dispositivo con un nonce.
  • Calcolare l'HMAC della chiave di autenticazione con il primo valore HMAC concatenato con un nonce generato dal servizio di autenticazione complementare.

Il secondo valore calcolato viene usato dal servizio per autenticare il dispositivo e impedire anche l'attacco di riproduzione nel canale di trasporto.

Diagramma del flusso di registrazione aggiornato.

Gestione ciclo di vita

Registrare una sola volta, usare ovunque

Senza un server back-end, gli utenti devono registrare separatamente il dispositivo complementare Windows Hello con ogni dispositivo Windows 10 desktop.

Un fornitore di dispositivi complementari o OEM può implementare un servizio Web per eseguire il roaming dello stato di registrazione tra desktop o dispositivi mobili Windows 10 utente. Per altri dettagli, vedere la sezione Roaming, Revoche e Servizio di filtro.

Gestione PIN

Prima di poter usare un dispositivo complementare, è necessario configurare un PIN nel dispositivo Windows 10 desktop. Ciò garantisce che l'utente disponga di un backup nel caso in cui il dispositivo complementare Windows Hello non funzioni. Il PIN è qualcosa che Windows gestisce e che le app non visualizzano mai. Per modificarla, l'utente passa alle opzioni di accesso > Account > Impostazioni.

Gestione e criterio

Gli utenti possono rimuovere un dispositivo complementare Windows Hello da un Windows 10 desktop eseguendo l'app del dispositivo complementare Windows Hello in tale dispositivo desktop.

Le aziende hanno due opzioni per controllare il framework del dispositivo complementare Windows Hello:

  • Attivare o disattivare la funzionalità
  • Definire l'elenco di dispositivi complementari Windows Hello consentiti con l'app locker di Windows

Il framework dispositivo complementare Windows Hello non supporta alcun modo centralizzato per mantenere l'inventario dei dispositivi complementari disponibili o un metodo per filtrare ulteriormente le istanze di un tipo di dispositivo complementare Windows Hello (ad esempio, è consentito solo un dispositivo complementare con un numero di serie compreso tra X e Y). Gli sviluppatori di app possono tuttavia creare un servizio per fornire tali funzionalità. Per altri dettagli, vedere la sezione Roaming, Revoche e Servizio di filtro.

Revoca

Il framework dispositivo complementare Windows Hello non supporta la rimozione di un dispositivo complementare da un dispositivo Windows 10 desktop specifico in remoto. Gli utenti possono invece rimuovere il dispositivo complementare Windows Hello tramite l'app del dispositivo complementare Windows Hello in esecuzione su Windows 10 desktop.

I fornitori di dispositivi complementari, tuttavia, possono creare un servizio per fornire funzionalità di revoca remota. Per altri dettagli, vedere la sezione Roaming, Revoche e Servizio di filtro.

Servizi di roaming e filtro

I fornitori di dispositivi complementari possono implementare un servizio Web che può essere usato per gli scenari seguenti:

  • Un servizio di filtro per le aziende: un'azienda può limitare il set di dispositivi complementari Windows Hello che possono funzionare nel proprio ambiente per selezionarne alcuni da un fornitore specifico. Ad esempio, l'azienda Contoso potrebbe ordinare 10.000 dispositivi complementari modello Y dal fornitore X e assicurarsi che solo tali dispositivi funzioneranno nel dominio Contoso (e non qualsiasi altro modello di dispositivo del fornitore X).
  • Inventario: un'azienda può determinare l'elenco dei dispositivi complementari esistenti usati in un ambiente aziendale.
  • Revoca in tempo reale: se un dipendente segnala che il dispositivo complementare viene smarrito o rubato, il servizio Web può essere usato per revocare il dispositivo.
  • Roaming: un utente deve registrare il dispositivo complementare una sola volta e funziona su tutti i Windows 10 desktop e Mobile.

L'implementazione di queste funzionalità richiede che l'app del dispositivo complementare Windows Hello controlli con il servizio Web in fase di registrazione e utilizzo. L'app del dispositivo complementare Windows Hello può essere ottimizzata per scenari di accesso memorizzati nella cache, ad esempio la richiesta di controllo con il servizio Web una sola volta al giorno (al costo di estendere il tempo di revoca fino a un giorno).

Modello API framework del dispositivo complementare Windows Hello

Panoramica

Un'app del dispositivo complementare Windows Hello deve contenere due componenti: un'app foregroud con interfaccia utente responsabile della registrazione e dell'annullamento della registrazione del dispositivo e un'attività in background che gestisce l'autenticazione.

Il flusso dell'API generale è il seguente:

  1. Registrare il dispositivo complementare Windows Hello
    • Assicurarsi che il dispositivo sia nelle vicinanze ed eseguire una query sulla relativa funzionalità (se necessario)
    • Generare due chiavi HMAC (sul lato del dispositivo complementare o sul lato app)
    • Chiamare RequestStartRegisteringDeviceAsync
    • Chiamare FinishRegisteringDeviceAsync
    • Assicurarsi che l'app del dispositivo complementare Windows Hello archivii le chiavi HMAC (se supportate) e l'app del dispositivo complementare Windows Hello elimini le copie
  2. Registrare l'attività in background
  3. Attendere l'evento corretto nell'attività in background
    • WaitingForUserConfirmation: attendere questo evento se l'azione o il movimento dell'utente sul lato dispositivo complementare Windows Hello è necessario per avviare il flusso di autenticazione
    • CollectCredential: attendere questo evento se il dispositivo complementare Windows Hello si basa sull'azione o sul movimento dell'utente sul lato PC per avviare il flusso di autenticazione (ad esempio, premendo la barra spaziatrice)
    • Altro trigger, ad esempio una smart card: assicurarsi di eseguire una query sullo stato di autenticazione corrente per chiamare le API corrette.
  4. Mantenere l'utente informato sui messaggi di errore o sui passaggi successivi necessari chiamando ShowNotificationMessageAsync. Chiamare questa API solo dopo la raccolta di un segnale di intento
  5. Sblocca
    • Assicurarsi che siano stati raccolti segnali di intento e presenza dell'utente
    • Chiamare StartAuthenticationAsync
    • Comunicare con il dispositivo complementare per eseguire le operazioni HMAC necessarie
    • Chiamare FinishAuthenticationAsync
  6. Annullare la registrazione di un dispositivo complementare Windows Hello quando l'utente lo richiede (ad esempio, se ha perso il dispositivo complementare)
    • Enumerare il dispositivo complementare Windows Hello per l'utente connesso tramite FindAllRegisteredDeviceInfoAsync
    • Annullare la registrazione usando UnregisterDeviceAsync

Registrazione e de-registrazione

La registrazione richiede due chiamate API al servizio di autenticazione complementare: RequestStartRegisteringDeviceAsync e FinishRegisteringDeviceAsync.

Prima di effettuare una di queste chiamate, l'app del dispositivo complementare Windows Hello deve assicurarsi che il dispositivo complementare Windows Hello sia disponibile. Se il dispositivo complementare Windows Hello è responsabile della generazione di chiavi HMAC (autenticazione e chiavi del dispositivo), l'app del dispositivo complementare Windows Hello deve anche chiedere al dispositivo complementare di generarle prima di effettuare una delle due chiamate precedenti. Se l'app del dispositivo complementare Windows Hello è responsabile della generazione di chiavi HMAC, è consigliabile farlo prima di richiamare le due chiamate precedenti.

Inoltre, come parte della prima chiamata API (RequestStartRegisteringDeviceAsync), l'app del dispositivo complementare Windows Hello deve decidere la funzionalità del dispositivo e prepararsi a passarla come parte della chiamata API; ad esempio, se il dispositivo complementare Windows Hello supporta l'archiviazione sicura per le chiavi HMAC. Se la stessa app del dispositivo complementare Windows Hello viene usata per gestire più versioni dello stesso dispositivo complementare e tali funzionalità cambiano (e richiede una query sul dispositivo per decidere), è consigliabile eseguire queste query prima della prima chiamata API.

La prima API (RequestStartRegisteringDeviceAsync) restituirà un handle usato dalla seconda API (FinishRegisteringDeviceAsync). La prima chiamata per la registrazione avvierà il prompt del PIN per assicurarsi che l'utente sia presente. Se non è stato configurato alcun PIN, questa chiamata avrà esito negativo. L'app del dispositivo complementare Windows Hello può verificare se il PIN è configurato o meno tramite la chiamata KeyCredentialManager.IsSupportedAsync. La chiamata RequestStartRegisteringDeviceAsync può avere esito negativo anche se i criteri hanno disabilitato l'utilizzo del dispositivo complementare Windows Hello.

Il risultato della prima chiamata viene restituito tramite l'enumerazione 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 seconda chiamata (Finish RegistrationDeviceAsync) completa la registrazione. Come parte del processo di registrazione, l'app del dispositivo complementare Windows Hello può archiviare i dati di configurazione del dispositivo complementare con il servizio di autenticazione complementare. Per questi dati è previsto un limite di dimensioni di 4K. Questi dati saranno disponibili per l'app del dispositivo complementare Windows Hello in fase di autenticazione. Questi dati possono essere usati, ad esempio, per connettersi al dispositivo complementare Windows Hello come un indirizzo MAC o se il dispositivo complementare Windows Hello non ha spazio di archiviazione e il dispositivo complementare vuole usare PC per l'archiviazione, è possibile usare i dati di configurazione. Si noti che tutti i dati sensibili archiviati come parte dei dati di configurazione devono essere crittografati con una chiave nota solo dal dispositivo complementare Windows Hello. Inoltre, dato che i dati di configurazione vengono archiviati da un servizio Windows, sono disponibili per l'app del dispositivo complementare Windows Hello nei profili utente.

L'app del dispositivo complementare Windows Hello può chiamare AbortRegisteringDeviceAsync per annullare la registrazione e passare un codice di errore. Il servizio di autenticazione complementare registra l'errore nei dati di telemetria. Un buon esempio per questa chiamata sarebbe quando si è verificato un problema con il dispositivo complementare Windows Hello e non è stato possibile completare la registrazione (ad esempio, non è possibile archiviare chiavi HMAC o la connessione BT è stata persa).

L'app del dispositivo complementare Windows Hello deve fornire all'utente un'opzione per annullare la registrazione del dispositivo complementare Windows Hello da Windows 10 desktop (ad esempio, se ha perso il dispositivo complementare o ha acquistato una versione più recente). Quando l'utente seleziona questa opzione, l'app del dispositivo complementare Windows Hello deve chiamare UnregisterDeviceAsync. Questa chiamata da parte dell'app del dispositivo complementare Windows Hello attiverà il servizio di autenticazione del dispositivo complementare per eliminare tutti i dati (incluse le chiavi HMAC) corrispondenti all'ID dispositivo specifico e all'AppId dell'app chiamante dal lato PC. Questa chiamata API non tenta di eliminare le chiavi HMAC dall'app del dispositivo complementare Windows Hello o dal lato del dispositivo complementare. Ciò rimane da implementare per l'app del dispositivo complementare Windows Hello.

L'app del dispositivo complementare Windows Hello è responsabile della visualizzazione di eventuali messaggi di errore che si verificano nella fase di registrazione e de-registrazione.

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

Autenticazione

L'autenticazione richiede due chiamate API al servizio di autenticazione complementare: StartAuthenticationAsync e FinishAuthencationAsync.

La prima API di avvio restituirà un handle usato dalla seconda API. La prima chiamata restituisce, tra le altre cose, un nonce che, una volta concatenato con altre cose, deve essere HMAC con la chiave del dispositivo archiviata nel dispositivo complementare Windows Hello. La seconda chiamata restituisce i risultati di HMAC con la chiave del dispositivo e può potenzialmente terminare con esito positivo l'autenticazione (ad esempio, l'utente visualizzerà il desktop).

La prima API di avvio (StartAuthenticationAsync) può non riuscire se i criteri hanno disabilitato il dispositivo complementare Windows Hello dopo la registrazione iniziale. Può anche non riuscire se la chiamata API è stata effettuata all'esterno degli stati WaitingForUserConfirmation o CollectCredential (più avanti in questa sezione). Può anche non riuscire se un'app del dispositivo complementare non registrata lo chiama. SecondaryAuthenticationFactorAuthenticationStatus Enum riepiloga i risultati possibili:

{
	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 seconda chiamata API (FinishAuthencationAsync) può non riuscire se il nonce fornito nella prima chiamata è scaduto (20 secondi). L'enumerazione SecondaryAuthenticationFactorFinishAuthenticationStatus acquisisce i risultati possibili.

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

La tempistica di due chiamate API (StartAuthenticationAsync e FinishAuthencationAsync) deve essere allineata al modo in cui il dispositivo complementare Windows Hello raccoglie le finalità, la presenza dell'utente e i segnali di disambiguazione (vedere Segnali utente per altri dettagli). Ad esempio, la seconda chiamata non deve essere inviata fino a quando non è disponibile il segnale di finalità. In altre parole, il PC non dovrebbe sbloccarsi se l'utente non ha espresso l'intento per esso. Per rendere questo più chiaro, presupporre che la prossimità Bluetooth viene usata per lo sblocco del PC, quindi un segnale intento esplicito deve essere raccolto, altrimenti, non appena l'utente cammina dal suo PC sulla strada verso la cucina, il PC si sblocca. Inoltre, il nonce restituito dalla prima chiamata è associato (20 secondi) e scadrà dopo un determinato periodo. Di conseguenza, la prima chiamata deve essere effettuata solo quando l'app del dispositivo complementare Windows Hello ha una buona indicazione della presenza del dispositivo complementare, ad esempio, il dispositivo complementare viene inserito nella porta USB o toccato sul lettore NFC. Con Bluetooth, è necessario prestare attenzione a evitare di influire sulla batteria sul lato PC o influire su altre attività Bluetooth in quel momento durante il controllo della presenza del dispositivo complementare Windows Hello. Inoltre, se è necessario fornire un segnale di presenza dell'utente (ad esempio digitando il PIN), è consigliabile effettuare la prima chiamata di autenticazione solo dopo la raccolta del segnale.

Il framework del dispositivo complementare Windows Hello consente all'app del dispositivo complementare Windows Hello di prendere decisioni informate su quando effettuare sopra due chiamate fornendo un quadro completo della posizione dell'utente nel flusso di autenticazione. Il framework dispositivo complementare Windows Hello fornisce questa funzionalità fornendo una notifica di modifica dello stato di blocco all'attività in background dell'app.

flusso del dispositivo complementare

I dettagli di ognuno di questi stati sono i seguenti:

Stato Descrizione
WaitingForUserConfirmation Questo evento di notifica di modifica dello stato viene generato quando viene visualizzata la schermata di blocco (ad esempio, l'utente ha premuto Windows + L). È consigliabile non richiedere messaggi di errore relativi alla difficoltà di trovare un dispositivo in questo stato. In generale, è consigliabile visualizzare i messaggi solo quando è disponibile un segnale intento. L'app del dispositivo complementare Windows Hello deve effettuare la prima chiamata API per l'autenticazione in questo stato se il dispositivo complementare raccoglie il segnale di finalità (ad esempio, toccando il lettore NFC, premendo un pulsante sul dispositivo complementare o un movimento specifico, ad esempio il clapping) e l'attività in background dell'app del dispositivo complementare Windows Hello riceve un'indicazione dal dispositivo complementare che è stato rilevato un segnale di finalità. In caso contrario, se l'app del dispositivo complementare Windows Hello si basa sul PC per avviare il flusso di autenticazione (facendo scorrere rapidamente lo schermo di sblocco o premendo la barra spaziatrice), l'app del dispositivo complementare Windows Hello deve attendere lo stato successivo (CollectCredential).
CollectingCredential Questo evento di notifica di modifica dello stato viene generato quando l'utente apre il coperchio del portatile, colpisce qualsiasi tasto sulla tastiera o scorre verso l'alto fino alla schermata di sblocco. Se il dispositivo complementare Windows Hello si basa sulle azioni precedenti per iniziare a raccogliere il segnale di finalità, l'app del dispositivo complementare Windows Hello deve iniziare a raccoglierla (ad esempio, tramite un popup sul dispositivo complementare che chiede se l'utente vuole sbloccare il PC). Questo sarebbe un buon momento per fornire casi di errore se l'app del dispositivo complementare Windows Hello richiede all'utente di fornire un segnale di presenza utente nel dispositivo complementare (ad esempio digitando il PIN nel dispositivo complementare Windows Hello).
SuspendingAuthentication Quando l'app del dispositivo complementare Windows Hello riceve questo stato, significa che il servizio di autenticazione complementare ha smesso di accettare le richieste di autenticazione.
CredentialCollected Ciò significa che un'altra app del dispositivo complementare Windows Hello ha chiamato la seconda API e che il servizio di autenticazione complementare sta verificando ciò che è stato inviato. A questo punto, il servizio di autenticazione complementare non accetta altre richieste di autenticazione, a meno che il servizio di autenticazione attualmente inviato non superi la verifica. L'app del dispositivo complementare Windows Hello deve rimanere ottimizzata fino al raggiungimento dello stato successivo.
CredentialAuthenticated Ciò significa che le credenziali inviate hanno funzionato. credentialAuthenticated ha l'ID dispositivo del dispositivo complementare Windows Hello che ha avuto esito positivo. L'app del dispositivo complementare Windows Hello deve assicurarsi di verificare se il dispositivo associato è stato il vincitore. In caso contrario, l'app del dispositivo complementare Windows Hello dovrebbe evitare di visualizzare i flussi di post-autenticazione (ad esempio un messaggio di esito positivo nel dispositivo complementare o ad esempio una vibrazione su tale dispositivo). Si noti che se la credenziale inviata non funziona, lo stato passerà allo stato CollectCredential.
StoppingAuthentication L'autenticazione è riuscita e l'utente ha visto il desktop. Tempo per terminare l'attività in background. Prima di uscire dall'attività in background, annullare esplicitamente la registrazione del gestore StageEvent. In questo modo l'attività in background verrà chiusa rapidamente.

Le app del dispositivo complementare Windows Hello devono chiamare solo le due API di autenticazione nei primi due stati. Le app del dispositivo complementare Windows Hello devono verificare lo scenario in cui viene generato questo evento. Ci sono due possibilità: sblocco o post sblocco. Attualmente è supportato solo lo sblocco. Nelle prossime versioni, è possibile che siano supportati scenari di post-sblocco. L'enumerazione SecondaryAuthenticationFactorAuthenticationScenario acquisisce queste due opzioni:

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

Esempio di codice completo:

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

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

		private void Authenticate()
		{
			int retryCount = 0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

			_deferral.Complete();
		}

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

Registrare un'attività in background

Quando l'app del dispositivo complementare Windows Hello registra il primo dispositivo complementare, deve anche registrare il componente attività in background che passerà le informazioni di autenticazione tra il servizio di autenticazione del dispositivo e il servizio di autenticazione del dispositivo complementare.

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

Errori e messaggi

Il framework del dispositivo complementare Windows Hello è responsabile di fornire feedback all'utente in merito all'esito positivo o negativo dell'accesso. Il framework dispositivo complementare Windows Hello fornirà un elenco di testo (localizzato) e messaggi di errore per l'app del dispositivo complementare Windows Hello tra cui scegliere. Questi verranno visualizzati nell'interfaccia utente di accesso.

errore del dispositivo complementare

Le app del dispositivo complementare Windows Hello possono usare ShowNotificationMessageAsync per visualizzare i messaggi all'utente come parte dell'interfaccia utente di accesso. Chiamare questa API quando è disponibile un segnale di intento. Si noti che un segnale di intento deve essere sempre raccolto sul lato del dispositivo complementare Windows Hello.

Esistono due tipi di messaggi: indicazioni ed errori.

I messaggi di guida sono progettati per mostrare all'utente come avviare il processo di sblocco. Questi messaggi vengono visualizzati all'utente una sola volta nella schermata di blocco, alla prima registrazione del dispositivo e non vengono mai visualizzati di nuovo. Questi messaggi continueranno a essere visualizzati nella schermata di blocco.

I messaggi di errore vengono sempre visualizzati e verranno visualizzati dopo che viene fornito un segnale di intento. Dato che un segnale di intento deve essere raccolto prima di visualizzare i messaggi all'utente e l'utente fornirà tale finalità solo usando uno dei dispositivi complementari Windows Hello, non deve esserci una situazione in cui più dispositivi complementari Windows Hello corre per visualizzare i messaggi di errore. Di conseguenza, il framework del dispositivo complementare Windows Hello non gestisce alcuna coda. Quando un chiamante richiede un messaggio di errore, verrà visualizzato per 5 secondi e tutte le altre richieste per visualizzare un messaggio di errore in tale 5 secondi vengono eliminate. Una volta trascorsi 5 secondi, si verifica l'opportunità per un altro chiamante di visualizzare un messaggio di errore. Non è consentito a qualsiasi chiamante di bloccare il canale di errore.

Le indicazioni e i messaggi di errore sono i seguenti. Il nome del dispositivo è un parametro passato dall'app del dispositivo complementare come parte di ShowNotificationMessageAsync.

Materiale sussidiario

  • "Scorrere rapidamente verso l'alto o premere la barra spaziatrice per accedere con il nome del dispositivo".
  • "Configurazione del dispositivo complementare. Attendere o usare un'altra opzione di accesso".
  • "Toccare il nome del dispositivo al lettore NFC per accedere".
  • "Ricerca del nome del dispositivo ..."
  • "Collegare il nome del dispositivo a una porta USB per accedere".

Errori

  • "Vedere il nome del dispositivo per istruzioni di accesso".
  • "Attivare Bluetooth per usare il nome del dispositivo per l'accesso".
  • "Attivare NFC per usare il nome del dispositivo per l'accesso".
  • "Connessione a una rete Wi-Fi per usare il nome del dispositivo per accedere."
  • "Toccare di nuovo il nome del dispositivo".
  • "L'azienda impedisce l'accesso con il nome del dispositivo. Usare un'altra opzione di accesso".
  • "Toccare il nome del dispositivo per accedere".
  • "Riposare il dito sul nome del dispositivo per accedere".
  • "Scorrere il dito sul nome del dispositivo per accedere".
  • "Non è stato possibile accedere con il nome del dispositivo. Usare un'altra opzione di accesso".
  • "Si è verificato un errore. Usare un'altra opzione di accesso e quindi configurare di nuovo il nome del dispositivo".
  • "Riprovare".
  • "Pronunciare la Passphrase vocale nel nome del dispositivo".
  • "Pronto per l'accesso con il nome del dispositivo".
  • "Usare prima un'altra opzione di accesso, quindi è possibile usare il nome del dispositivo per accedere".

Enumerazione dei dispositivi registrati

L'app del dispositivo complementare Windows Hello può enumerare l'elenco dei dispositivi complementari registrati tramite la chiamata FindAllRegisteredDeviceInfoAsync. Questa API supporta due tipi di query definiti tramite enum SecondaryAuthenticationFactorDeviceFindScope:

{
	User = 0,
	AllUsers,
}

Il primo ambito restituisce l'elenco dei dispositivi per l'utente connesso. Il secondo restituisce l'elenco per tutti gli utenti del PC. Il primo ambito deve essere usato in fase di annullamento della registrazione per evitare di annullare la registrazione del dispositivo complementare Windows Hello di un altro utente. Il secondo deve essere usato in fase di autenticazione o registrazione: in fase di registrazione, questa enumerazione può aiutare l'app a evitare di registrare lo stesso dispositivo complementare Windows Hello due volte.

Si noti che anche se l'app non esegue questo controllo, il PC esegue e rifiuterà la registrazione dello stesso dispositivo complementare Windows Hello più volte. In fase di autenticazione, l'uso dell'ambito AllUsers consente all'app del dispositivo complementare Windows Hello di supportare il flusso utente switch user: accedere all'utente A quando l'utente B è connesso (questo richiede che entrambi gli utenti abbiano installato l'app del dispositivo complementare Windows Hello e l'utente A abbia registrato i propri dispositivi complementari con il PC e il PC sia seduto nella schermata di blocco (o schermata di accesso)).

Requisiti di sicurezza

Il servizio di autenticazione complementare fornisce le seguenti protezioni di sicurezza.

  • Il malware in un dispositivo desktop Windows 10 in esecuzione come utente medio o contenitore di app non può usare il dispositivo complementare Windows Hello per accedere alle chiavi delle credenziali utente (archiviate come parte di Windows Hello) in un PC in modo invisibile all'utente.
  • Un utente malintenzionato in un dispositivo desktop Windows 10 non può usare il dispositivo complementare Windows Hello appartenente a un altro utente nel dispositivo desktop Windows 10 per ottenere l'accesso invisibile all'utente alle chiavi delle credenziali utente (nello stesso dispositivo desktop Windows 10).
  • Il malware nel dispositivo complementare Windows Hello non può ottenere automaticamente l'accesso alle chiavi delle credenziali utente in un dispositivo desktop Windows 10, incluse le funzionalità o il codice sviluppato specificamente per il framework del dispositivo complementare Windows Hello.
  • Un utente malintenzionato non può sbloccare un dispositivo Windows 10 desktop acquisendo il traffico tra il dispositivo complementare Windows Hello e il dispositivo Windows 10 desktop e riproponendolo in un secondo momento. L'utilizzo di nonce, authkey e HMAC nel protocollo garantisce la protezione da un attacco di riproduzione.
  • Il malware o un utente malintenzionato in un PC rosso non può usare il dispositivo complementare Windows Hello per ottenere l'accesso al PC utente onesto. Questo risultato viene ottenuto tramite l'autenticazione reciproca tra il servizio di autenticazione complementare e il dispositivo complementare Windows Hello tramite l'uso di authkey e HMAC nel protocollo.

La chiave per ottenere le protezioni di sicurezza enumerate in precedenza consiste nel proteggere le chiavi HMAC da accessi non autorizzati e verificare anche la presenza dell'utente. In particolare, deve soddisfare questi requisiti:

  • Fornire protezione dalla clonazione del dispositivo complementare Windows Hello
  • Fornire protezione da intercettazioni durante l'invio di chiavi HMAC al momento della registrazione al PC
  • Assicurarsi che il segnale di presenza dell'utente sia disponibile