Использование Touch ID и Face ID с Xamarin.iOS
iOS поддерживает две системы проверки подлинности биография метрик:
- Сенсорный идентификатор использует датчик отпечатка пальца под кнопкой "Главная".
- Идентификатор лица использует датчики камеры переднего плана для проверки подлинности пользователей с помощью сканирования лица.
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
этот метод используется для отображения пользовательского интерфейса и завершения процесса проверки подлинности.
Пример проекта содержит макетные данные и представление для отображения данных в случае успешной проверки подлинности.
Дополнительные ссылки
- О сенсорном идентификаторе support.apple.com
- Сведения об идентификаторе лица в support.apple.com