Partager via


Utiliser Touch ID et Face ID avec Xamarin.iOS

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

  1. L’ID tactile utilise un capteur d’empreinte digitale sous le bouton Accueil.
  2. Face ID utilise des capteurs de caméra frontale pour authentifier les utilisateurs avec une analyse faciale.

L’ID tactile 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’empreinte digitale et d’authentifier les utilisateurs à l’aide de ces informations. Selon Apple, les données de visage et d’empreinte digitale ne quittent pas l’appareil et ne sont pas sauvegardées sur 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’empreinte digitale ou accéder directement à l’enclave sécurisée.

L’ID tactile et l’ID visage 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 une 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.
  • Personnalisez et affichez les invites d’authentification.
  • Réutilisez ou invalidez un état d’authentification.
  • Gérer les informations d’identification.

Détecter les méthodes d’authentification disponibles

L’exemple de projet inclut une AuthenticationView sauvegarde 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 et LAContext utilise la méthode pour déterminer si l’authentification CanEvaluatePolicy biométrique est activée. Si c’est le cas, il case activée la version du système et BiometryType l’énumération pour déterminer quelles options biométriques sont disponibles.

Si l’authentification biométrique n’est pas activée, l’application tente de revenir à l’authentification par code confidentiel. Si aucune authentification biométrique ni pin 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é par le biais de l’authentification locale.

Authentifier un utilisateur

L’exemple AuthenticationViewController 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 Connexion . Un nouvel LAContext objet est instancié et la version de l’appareil est case activée ed 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, revenez à l’authentification par code confidentiel si possible, puis proposez 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.