Compartilhar via


Usar o Touch ID e o Face ID com o Xamarin.iOS

O iOS suporta dois sistemas de autenticação biométrica:

  1. O Touch ID usa um sensor de impressão digital no botão Início.
  2. O Face ID usa sensores de câmera frontal para autenticar os usuários com uma varredura facial.

O Touch ID foi introduzido no iOS 7 e o Face ID no iOS 11.

Esses sistemas de autenticação dependem de um processador de segurança baseado em hardware chamado Secure Enclave. O Secure Enclave é responsável por criptografar representações matemáticas de dados faciais e de impressões digitais e autenticar usuários usando essas informações. De acordo com a Apple, os dados faciais e de impressão digital não saem do dispositivo e não são copiados para o iCloud. Os aplicativos interagem com o Secure Enclave por meio da API de Autenticação Local e não podem recuperar dados faciais ou de impressão digital ou acessar diretamente o Secure Enclave.

O Touch ID e o Face ID podem ser usados por aplicativos para autenticar um usuário antes de fornecer acesso a conteúdo protegido.

Contexto de autenticação local

A autenticação biométrica no iOS depende de um objeto de contexto de autenticação local, que é uma instância da LAContext classe. A LAContext classe permite:

  • Verifique a disponibilidade de hardware biométrico.
  • Avaliar políticas de autenticação.
  • Avaliar controles de acesso.
  • Personalize e exiba prompts de autenticação.
  • Reutilizar ou invalidar um estado de autenticação.
  • Gerenciar credenciais.

Detectar métodos de autenticação disponíveis

O projeto de exemplo inclui um AuthenticationView suporte de um AuthenticationViewControllerarquivo . Essa classe substitui o ViewWillAppear método para detectar métodos de autenticação disponíveis:

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

O ViewWillAppear método é chamado quando a interface do usuário está prestes a ser exibida para o usuário. Esse método define uma nova instância de LAContext e usa o método para determinar se a CanEvaluatePolicy autenticação biométrica está habilitada. Em caso afirmativo, ele verifica a versão do sistema e BiometryType o enum para determinar quais opções biométricas estão disponíveis.

Se a autenticação biométrica não estiver habilitada, o aplicativo tentará retornar à autenticação por PIN. Se nem a autenticação biométrica nem a autenticação por PIN estiverem disponíveis, o proprietário do dispositivo não habilitou os recursos de segurança e o conteúdo não poderá ser protegido por meio da autenticação local.

Autenticar um usuário

O AuthenticationViewController projeto de exemplo inclui um AuthenticateMe método, que é responsável por autenticar o usuário:

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

O AuthenticateMe método é chamado em resposta ao usuário tocar em um botão de login . Um novo LAContext objeto é instanciado e a versão do dispositivo é verificada para determinar quais propriedades definir no contexto de autenticação local.

O CanEvaluatePolicy método é chamado para verificar se a autenticação biométrica está habilitada, retornar à autenticação por PIN, se possível, e, finalmente, oferecer um modo não seguro se nenhuma autenticação estiver disponível. Se um método de autenticação estiver disponível, o EvaluatePolicy método será usado para mostrar a interface do usuário e concluir o processo de autenticação.

O projeto de exemplo contém dados fictícios e uma exibição para exibir os dados se a autenticação for bem-sucedida.