Uso de Touch ID y Face ID con Xamarin.iOS

Ejemplo de descarga Descarga del ejemplo

iOS admite dos sistemas de autenticación biométrica:

  1. Touch ID usa un sensor de huella digital en el botón Inicio.
  2. Face ID usa sensores de cámara frontales para autenticar a los usuarios con un examen facial.

Touch ID se introdujo en iOS 7 y Face ID en iOS 11.

Estos sistemas de autenticación se basan en un procesador de seguridad basado en hardware denominado Enclave seguro. El enclave seguro es responsable de cifrar las representaciones matemáticas de los datos faciales y de huella digital, y de autenticar a los usuarios con esta información. Según Apple, los datos faciales y de huella digital no salen del dispositivo y no se copian en iCloud. Las aplicaciones interactúan con el enclave seguro a través de la API de autenticación local y no pueden recuperar datos de cara o huella digital ni acceder directamente al enclave seguro.

Las aplicaciones pueden usar Touch ID y Face ID para autenticar a un usuario antes de proporcionar acceso al contenido protegido.

Contexto de autenticación local

La autenticación biométrica en iOS se basa en un objeto de contexto de autenticación local, que es una instancia de la clase . La LAContext clase le permite:

  • Compruebe la disponibilidad del hardware biométrico.
  • Evalúe las directivas de autenticación.
  • Evalúe los controles de acceso.
  • Personalice y muestre los mensajes de autenticación.
  • Reutilizar o invalidar un estado de autenticación.
  • Administrar credenciales.

Detección de métodos de autenticación disponibles

El proyecto de ejemplo incluye AuthenticationView un objeto con el respaldo de AuthenticationViewController . Esta clase invalida el método para ViewWillAppear detectar los métodos de autenticación 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);
    }
}

Se ViewWillAppear llama al método cuando la interfaz de usuario está a punto de mostrarse al usuario. Este método define una nueva instancia de LAContext y usa el método para determinar si está habilitada la CanEvaluatePolicy autenticación biométrica. Si es así, comprueba la versión del sistema y BiometryType la enumeración para determinar qué opciones biométricas están disponibles.

Si la autenticación biométrica no está habilitada, la aplicación intenta volver a la autenticación de PIN. Si no hay disponible la autenticación biométrica ni de PIN, el propietario del dispositivo no ha habilitado las características de seguridad y el contenido no se puede proteger mediante la autenticación local.

Autenticación de un usuario

En AuthenticationViewController el proyecto de ejemplo se incluye un método , que es responsable de autenticar al AuthenticateMe usuario:

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

Se AuthenticateMe llama al método en respuesta al usuario que pulsa un botón Inicio AuthenticateMe sesión. Se crea una instancia de un nuevo objeto y se comprueba la versión del dispositivo para determinar qué propiedades se LAContext establecerán en el contexto de autenticación local.

Se llama al método para comprobar si la autenticación biométrica está habilitada, volver a la autenticación de PIN si es posible y, por último, ofrecer un modo no seguro si no hay ninguna CanEvaluatePolicy autenticación disponible. Si hay un método de autenticación disponible, el método se usa para mostrar la interfaz de EvaluatePolicy usuario y completar el proceso de autenticación.

El proyecto de ejemplo contiene datos ficticios y una vista para mostrar los datos si la autenticación se realiza correctamente.