Использование Touch ID и Face ID с Xamarin.iOS

iOS поддерживает две системы проверки подлинности биография метрик:

  1. Сенсорный идентификатор использует датчик отпечатка пальца под кнопкой "Главная".
  2. Идентификатор лица использует датчики камеры переднего плана для проверки подлинности пользователей с помощью сканирования лица.

Touch ID появился в iOS 7 и Face ID в iOS 11.

Эти системы проверки подлинности используют аппаратный процессор безопасности под названием Secure Enclave. Безопасный анклава отвечает за шифрование математических представлений данных лица и отпечатков пальцев, а также проверку подлинности пользователей с помощью этой информации. По данным Apple, данные о лицах и отпечатках пальцев не покидают устройство и не создают резервную копию в iCloud. Приложения взаимодействуют с безопасным анклавом через API локальной проверки подлинности и не могут получить данные лиц или отпечатков пальцев или напрямую получить доступ к защищенному анклавам.

Touch ID и Face ID можно использовать приложениями для проверки подлинности пользователя перед предоставлением доступа к защищенному содержимому.

Контекст локальной проверки подлинности

Биометрическая проверка подлинности в iOS зависит от объекта контекста локальной LAContext проверки подлинности, который является экземпляром класса. Класс LAContext позволяет:

  • Проверьте доступность оборудования биография метрики.
  • Оценка политик проверки подлинности.
  • Оценка элементов управления доступом.
  • Настройка и отображение запросов проверки подлинности.
  • Повторное использование или недопустимое состояние проверки подлинности.
  • Управление учетными данными.

Обнаружение доступных методов проверки подлинности

Пример проекта включает в себя поддерживаемый AuthenticationView объект AuthenticationViewController. Этот класс переопределяет ViewWillAppear метод для обнаружения доступных методов проверки подлинности:

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

Метод ViewWillAppear вызывается, когда пользовательский интерфейс будет отображаться пользователю. Этот метод определяет новый экземпляр LAContext и использует CanEvaluatePolicy метод, чтобы определить, включена ли проверка подлинности биография метрик. Если да, он проверка системную версию и BiometryType перечисление, чтобы определить, какие параметры биография метрик доступны.

Если проверка подлинности биография метрики не включена, приложение пытается вернуться к проверке подлинности ПИН-кода. Если ни биография метрика, ни проверка подлинности ПИН-кода не доступна, владелец устройства не включил функции безопасности и содержимое нельзя защитить с помощью локальной проверки подлинности.

Проверка подлинности пользователя

В AuthenticationViewController примере проекта содержится AuthenticateMe метод, который отвечает за проверку подлинности пользователя:

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

Метод AuthenticateMe вызывается в ответ на нажатие кнопки входа пользователя. Создается экземпляр нового LAContext объекта, и версия устройства проверка, чтобы определить, какие свойства следует задать в контексте локальной проверки подлинности.

Метод CanEvaluatePolicy вызывается для проверка если включена проверка подлинности биография метрики, откатитесь к проверке подлинности ПИН-кода по возможности и, наконец, предложите незащищенный режим, если проверка подлинности недоступна. Если доступен метод проверки подлинности, EvaluatePolicy этот метод используется для отображения пользовательского интерфейса и завершения процесса проверки подлинности.

Пример проекта содержит макетные данные и представление для отображения данных в случае успешной проверки подлинности.