Biometria con impronta digitale

Questo articolo illustra come aggiungere la biometria delle impronte digitali all'app UWP (Universal Windows Platform). L'inclusione di una richiesta di autenticazione delle impronte digitali quando l'utente deve acconsentire a una particolare azione aumenta la sicurezza dell'app. Ad esempio, è possibile richiedere l'autenticazione dell'impronta digitale prima di autorizzare un acquisto in-app o l'accesso a risorse riservate. L'autenticazione tramite impronte digitali è gestita dalla classe UserConsentVerifier dello spazio dei nomi Windows.Security.Credentials.UI.

Controllare la presenza di un lettore di impronte digitali nel dispositivo

Per verificare se il dispositivo dispone di un lettore di impronte digitali, chiamare UserConsentVerifier.CheckAvailabilityAsync. Anche se un dispositivo supporta l'autenticazione con impronta digitale, l'app deve comunque fornire agli utenti un'opzione in Impostazioni per abilitarla o disabilitarla.

public async System.Threading.Tasks.Task<string> CheckFingerprintAvailability()
{
    string returnMessage = "";

    try
    {
        // Check the availability of fingerprint authentication.
        var ucvAvailability = await Windows.Security.Credentials.UI.UserConsentVerifier.CheckAvailabilityAsync();

        switch (ucvAvailability)
        {
            case Windows.Security.Credentials.UI.UserConsentVerifierAvailability.Available:
                returnMessage = "Fingerprint verification is available.";
                break;
            case Windows.Security.Credentials.UI.UserConsentVerifierAvailability.DeviceBusy:
                returnMessage = "Biometric device is busy.";
                break;
            case Windows.Security.Credentials.UI.UserConsentVerifierAvailability.DeviceNotPresent:
                returnMessage = "No biometric device found.";
                break;
            case Windows.Security.Credentials.UI.UserConsentVerifierAvailability.DisabledByPolicy:
                returnMessage = "Biometric verification is disabled by policy.";
                break;
            case Windows.Security.Credentials.UI.UserConsentVerifierAvailability.NotConfiguredForUser:
                returnMessage = "The user has no fingerprints registered. Please add a fingerprint to the " +
                                "fingerprint database and try again.";
                break;
            default:
                returnMessage = "Fingerprints verification is currently unavailable.";
                break;
        }
    }
    catch (Exception ex)
    {
        returnMessage = "Fingerprint authentication availability check failed: " + ex.ToString();
    }

    return returnMessage;
}

Per richiedere il consenso dell'utente da un'analisi delle impronte digitali, chiamare il metodo UserConsentVerifier.RequestVerificationAsync. Per il corretto funzionamento dell'autenticazione tramite impronta digitale, l'utente deve aver aggiunto in precedenza una "firma" di impronta digitale al database delle impronte digitali.

Quando si chiama UserConsentVerifier.RequestVerificationAsync, viene visualizzata una finestra di dialogo modale che richiede un'analisi delle impronte digitali. È possibile fornire un messaggio al metodo UserConsentVerifier.RequestVerificationAsync che verrà visualizzato all'utente come parte della finestra di dialogo modale, come illustrato nell'immagine seguente.

private async System.Threading.Tasks.Task<string> RequestConsent(string userMessage)
{
    string returnMessage;

    if (String.IsNullOrEmpty(userMessage))
    {
        userMessage = "Please provide fingerprint verification.";
    }

    try
    {
        // Request the logged on user's consent via fingerprint swipe.
        var consentResult = await Windows.Security.Credentials.UI.UserConsentVerifier.RequestVerificationAsync(userMessage);

        switch (consentResult)
        {
            case Windows.Security.Credentials.UI.UserConsentVerificationResult.Verified:
                returnMessage = "Fingerprint verified.";
                break;
            case Windows.Security.Credentials.UI.UserConsentVerificationResult.DeviceBusy:
                returnMessage = "Biometric device is busy.";
                break;
            case Windows.Security.Credentials.UI.UserConsentVerificationResult.DeviceNotPresent:
                returnMessage = "No biometric device found.";
                break;
            case Windows.Security.Credentials.UI.UserConsentVerificationResult.DisabledByPolicy:
                returnMessage = "Biometric verification is disabled by policy.";
                break;
            case Windows.Security.Credentials.UI.UserConsentVerificationResult.NotConfiguredForUser:
                returnMessage = "The user has no fingerprints registered. Please add a fingerprint to the " +
                                "fingerprint database and try again.";
                break;
            case Windows.Security.Credentials.UI.UserConsentVerificationResult.RetriesExhausted:
                returnMessage = "There have been too many failed attempts. Fingerprint authentication canceled.";
                break;
            case Windows.Security.Credentials.UI.UserConsentVerificationResult.Canceled:
                returnMessage = "Fingerprint authentication canceled.";
                break;
            default:
                returnMessage = "Fingerprint authentication is currently unavailable.";
                break;
        }
    }
    catch (Exception ex)
    {
        returnMessage = "Fingerprint authentication failed: " + ex.ToString();
    }

    return returnMessage;
}