Utiliser Touch ID et Face ID avec Xamarin.iOS

Télécharger l’exemple Télécharger l’exemple

iOS prend en charge deux systèmes d’authentification biométrique :

  1. Touch ID utilise un capteur d’empreintes digitales sous le bouton Accueil.
  2. Face ID utilise des capteurs de caméra frontale pour authentifier les utilisateurs à l’aide d’une analyse faciale.

Touch ID a été introduit dans iOS 7 et Face ID dans iOS 11.

Ces systèmes d’authentification s’appuient sur un processeur de sécurité basé sur le matériel appelé Enclave sécurisée. L’enclave sécurisée est chargée de chiffrer les représentations mathématiques des données de visage et d’empreintes digitales, et d’authentifier les utilisateurs à l’aide de ces informations. Selon Apple, les données de visage et d’empreintes digitales ne quittent pas l’appareil et ne sont pas sauvegardées dans iCloud. Les applications interagissent avec l’enclave sécurisée via l’API d’authentification locale et ne peuvent pas récupérer les données de visage ou d’empreintes digitales ou accéder directement à l’enclave sécurisée.

Touch ID et Face ID peuvent être utilisés par les applications pour authentifier un utilisateur avant de fournir l’accès au contenu protégé.

Contexte d’authentification local

L’authentification biométrique sur iOS s’appuie sur un objet de contexte d’authentification local, qui est un instance de la LAContext classe. La LAContext classe vous permet de :

  • Vérifiez la disponibilité du matériel biométrique.
  • Évaluez les stratégies d’authentification.
  • Évaluez les contrôles d’accès.
  • Personnaliser et afficher des invites d’authentification.
  • Réutiliser ou invalider un état d’authentification.
  • Gérer les informations d’identification.

Détecter les méthodes d’authentification disponibles

L’exemple de projet inclut un AuthenticationView soutenu par un AuthenticationViewController. Cette classe remplace la ViewWillAppear méthode pour détecter les méthodes d’authentification disponibles :

partial class AuthenticationViewController: UIViewController
{
    // ...
    string BiometryType = "";

    public override void ViewWillAppear(bool animated)
    {
        base.ViewWillAppear(animated);
        unAuthenticatedLabel.Text = "";
    
        var context = new LAContext();
        var buttonText = "";

        // Is login with biometrics possible?
        if (context.CanEvaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics, out var authError1))
        {
            // has Touch ID or Face ID
            if (UIDevice.CurrentDevice.CheckSystemVersion(11, 0))
            {
                context.LocalizedReason = "Authorize for access to secrets"; // iOS 11
                BiometryType = context.BiometryType == LABiometryType.TouchId ? "Touch ID" : "Face ID";
                buttonText = $"Login with {BiometryType}";
            }
            // No FaceID before iOS 11
            else
            {
                buttonText = $"Login with Touch ID";
            }
        }

        // Is pin login possible?
        else if (context.CanEvaluatePolicy(LAPolicy.DeviceOwnerAuthentication, out var authError2))
        {
            buttonText = $"Login"; // with device PIN
            BiometryType = "Device PIN";
        }

        // Local authentication not possible
        else
        {
            // Application might choose to implement a custom username/password
            buttonText = "Use unsecured";
            BiometryType = "none";
        }
        AuthenticateButton.SetTitle(buttonText, UIControlState.Normal);
    }
}

La ViewWillAppear méthode est appelée lorsque l’interface utilisateur est sur le point d’être affichée à l’utilisateur. Cette méthode définit une nouvelle instance de LAContext et utilise la méthode pour déterminer si l’authentification CanEvaluatePolicy biométrique est activée. Si c’est le cas, il vérifie la version du système et BiometryType l’énumération pour déterminer les options biométriques disponibles.

Si l’authentification biométrique n’est pas activée, l’application tente de revenir à l’authentification par code confidentiel. Si ni la biométrie ni l’authentification par code confidentiel n’est disponible, le propriétaire de l’appareil n’a pas activé les fonctionnalités de sécurité et le contenu ne peut pas être sécurisé via l’authentification locale.

Authentifier un utilisateur

dans AuthenticationViewController l’exemple de projet inclut une AuthenticateMe méthode, qui est responsable de l’authentification de l’utilisateur :

partial class AuthenticationViewController: UIViewController
{
    // ...
    string BiometryType = "";

    partial void AuthenticateMe(UIButton sender)
    {
        var context = new LAContext();
        NSError AuthError;
        var localizedReason = new NSString("To access secrets");
    
        // Because LocalAuthentication APIs have been extended over time,
        // you must check iOS version before setting some properties
        context.LocalizedFallbackTitle = "Fallback";
    
        if (UIDevice.CurrentDevice.CheckSystemVersion(10, 0))
        {
            context.LocalizedCancelTitle = "Cancel";
        }
        if (UIDevice.CurrentDevice.CheckSystemVersion(11, 0))
        {
            context.LocalizedReason = "Authorize for access to secrets";
            BiometryType = context.BiometryType == LABiometryType.TouchId ? "TouchID" : "FaceID";
        }
    
        // Check if biometric authentication is possible
        if (context.CanEvaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics, out AuthError))
        {
            replyHandler = new LAContextReplyHandler((success, error) =>
            {
                // This affects UI and must be run on the main thread
                this.InvokeOnMainThread(() =>
                {
                    if (success)
                    {
                        PerformSegue("AuthenticationSegue", this);
                    }
                    else
                    {
                        unAuthenticatedLabel.Text = $"{BiometryType} Authentication Failed";
                    }
                });
    
            });
            context.EvaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics, localizedReason, replyHandler);
        }

        // Fall back to PIN authentication
        else if (context.CanEvaluatePolicy(LAPolicy.DeviceOwnerAuthentication, out AuthError))
        {
            replyHandler = new LAContextReplyHandler((success, error) =>
            {
                // This affects UI and must be run on the main thread
                this.InvokeOnMainThread(() =>
                {
                    if (success)
                    {
                        PerformSegue("AuthenticationSegue", this);
                    }
                    else
                    {
                        unAuthenticatedLabel.Text = "Device PIN Authentication Failed";
                        AuthenticateButton.Hidden = true;
                    }
                });
    
            });
            context.EvaluatePolicy(LAPolicy.DeviceOwnerAuthentication, localizedReason, replyHandler);
        }

        // User hasn't configured any authentication: show dialog with options
        else
        {
            unAuthenticatedLabel.Text = "No device auth configured";
            var okCancelAlertController = UIAlertController.Create("No authentication", "This device does't have authentication configured.", UIAlertControllerStyle.Alert);
            okCancelAlertController.AddAction(UIAlertAction.Create("Use unsecured", UIAlertActionStyle.Default, alert => PerformSegue("AuthenticationSegue", this)));
            okCancelAlertController.AddAction(UIAlertAction.Create("Cancel", UIAlertActionStyle.Cancel, alert => Console.WriteLine("Cancel was clicked")));
            PresentViewController(okCancelAlertController, true, null);
        }
    } 
}

La AuthenticateMe méthode est appelée en réponse à l’utilisateur appuyant sur un bouton De connexion . Un nouvel LAContext objet est instancié et la version de l’appareil est vérifiée pour déterminer les propriétés à définir sur le contexte d’authentification local.

La CanEvaluatePolicy méthode est appelée pour case activée si l’authentification biométrique est activée, revenir à l’authentification par code confidentiel si possible et enfin offrir un mode non sécurisé si aucune authentification n’est disponible. Si une méthode d’authentification est disponible, la EvaluatePolicy méthode est utilisée pour afficher l’interface utilisateur et terminer le processus d’authentification.

L’exemple de projet contient des données fictives et une vue pour afficher les données si l’authentification réussit.