Utiliser Touch ID et Face ID avec Xamarin.iOS
iOS prend en charge deux systèmes d’authentification biométrique :
- Touch ID utilise un capteur d’empreintes digitales sous le bouton Accueil.
- Face ID utilise des capteurs de caméra frontale pour authentifier les utilisateurs à l’aide d’une analyse faciale.
Touch ID a été introduit dans iOS 7 et Face ID dans iOS 11.
Ces systèmes d’authentification s’appuient sur un processeur de sécurité basé sur le matériel appelé Enclave sécurisée. L’enclave sécurisée est chargée de chiffrer les représentations mathématiques des données de visage et d’empreintes digitales, et d’authentifier les utilisateurs à l’aide de ces informations. Selon Apple, les données de visage et d’empreintes digitales ne quittent pas l’appareil et ne sont pas sauvegardées dans iCloud. Les applications interagissent avec l’enclave sécurisée via l’API d’authentification locale et ne peuvent pas récupérer les données de visage ou d’empreintes digitales ou accéder directement à l’enclave sécurisée.
Touch ID et Face ID peuvent être utilisés par les applications pour authentifier un utilisateur avant de fournir l’accès au contenu protégé.
Contexte d’authentification local
L’authentification biométrique sur iOS s’appuie sur un objet de contexte d’authentification local, qui est un instance de la LAContext
classe. La LAContext
classe vous permet de :
- Vérifiez la disponibilité du matériel biométrique.
- Évaluez les stratégies d’authentification.
- Évaluez les contrôles d’accès.
- Personnaliser et afficher des invites d’authentification.
- Réutiliser ou invalider un état d’authentification.
- Gérer les informations d’identification.
Détecter les méthodes d’authentification disponibles
L’exemple de projet inclut un AuthenticationView
soutenu par un AuthenticationViewController
. Cette classe remplace la ViewWillAppear
méthode pour détecter les méthodes d’authentification 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);
}
}
La ViewWillAppear
méthode est appelée lorsque l’interface utilisateur est sur le point d’être affichée à l’utilisateur. Cette méthode définit une nouvelle instance de LAContext
et utilise la méthode pour déterminer si l’authentification CanEvaluatePolicy
biométrique est activée. Si c’est le cas, il vérifie la version du système et BiometryType
l’énumération pour déterminer les options biométriques disponibles.
Si l’authentification biométrique n’est pas activée, l’application tente de revenir à l’authentification par code confidentiel. Si ni la biométrie ni l’authentification par code confidentiel n’est disponible, le propriétaire de l’appareil n’a pas activé les fonctionnalités de sécurité et le contenu ne peut pas être sécurisé via l’authentification locale.
Authentifier un utilisateur
dans AuthenticationViewController
l’exemple de projet inclut une AuthenticateMe
méthode, qui est responsable de l’authentification de l’utilisateur :
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);
}
}
}
La AuthenticateMe
méthode est appelée en réponse à l’utilisateur appuyant sur un bouton De connexion . Un nouvel LAContext
objet est instancié et la version de l’appareil est vérifiée pour déterminer les propriétés à définir sur le contexte d’authentification local.
La CanEvaluatePolicy
méthode est appelée pour case activée si l’authentification biométrique est activée, revenir à l’authentification par code confidentiel si possible et enfin offrir un mode non sécurisé si aucune authentification n’est disponible. Si une méthode d’authentification est disponible, la EvaluatePolicy
méthode est utilisée pour afficher l’interface utilisateur et terminer le processus d’authentification.
L’exemple de projet contient des données fictives et une vue pour afficher les données si l’authentification réussit.
Liens connexes
- Exemple d’authentification locale à l’aide de Touch ID ou face ID
- À propos de Touch ID sur support.apple.com
- À propos de Face ID sur support.apple.com