Uso de Touch ID y Face ID con Xamarin.iOS
iOS admite dos sistemas de autenticación biométrica:
- Touch ID usa un sensor de huella digital en el botón Inicio.
- 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.
Vínculos relacionados
- Autenticación local mediante Touch ID o ejemplo de Face ID
- Acerca de Touch ID en support.apple.com
- Acerca de Face ID en support.apple.com
Descarga del ejemplo