Utiliser Touch ID et Face ID avec Xamarin.iOS
iOS prend en charge deux systèmes d’authentification biométrique :
- L’ID tactile utilise un capteur d’empreinte digitale sous le bouton Accueil.
- Face ID utilise des capteurs de caméra frontale pour authentifier les utilisateurs avec une analyse faciale.
L’ID tactile 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’empreinte digitale et d’authentifier les utilisateurs à l’aide de ces informations. Selon Apple, les données de visage et d’empreinte digitale ne quittent pas l’appareil et ne sont pas sauvegardées sur 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’empreinte digitale ou accéder directement à l’enclave sécurisée.
L’ID tactile et l’ID visage 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 une 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.
- Personnalisez et affichez les invites d’authentification.
- Réutilisez ou invalidez un état d’authentification.
- Gérer les informations d’identification.
Détecter les méthodes d’authentification disponibles
L’exemple de projet inclut une AuthenticationView
sauvegarde 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 et LAContext
utilise la méthode pour déterminer si l’authentification CanEvaluatePolicy
biométrique est activée. Si c’est le cas, il case activée la version du système et BiometryType
l’énumération pour déterminer quelles options biométriques sont disponibles.
Si l’authentification biométrique n’est pas activée, l’application tente de revenir à l’authentification par code confidentiel. Si aucune authentification biométrique ni pin 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é par le biais de l’authentification locale.
Authentifier un utilisateur
L’exemple AuthenticationViewController
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 Connexion . Un nouvel LAContext
objet est instancié et la version de l’appareil est case activée ed 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, revenez à l’authentification par code confidentiel si possible, puis proposez 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
- À propos de l’ID tactile sur support.apple.com
- À propos de l’ID visage sur support.apple.com