Verwenden von Touch ID und Gesichtserkennung mit Xamarin.iOS
iOS unterstützt zwei biometrische Authentifizierungssysteme:
- Touch ID verwendet einen Fingerabdrucksensor unter der Starttaste.
- Face ID verwendet Frontkamerasensoren, um Benutzer mit einer Gesichtserkennung zu authentifizieren.
Touch ID wurde in iOS 7 und Face ID in iOS 11 eingeführt.
Diese Authentifizierungssysteme basieren auf einem hardwarebasierten Sicherheitsprozessor namens Secure Enclave. Die Secure Enclave ist für die Verschlüsselung mathematischer Darstellungen von Gesichts- und Fingerabdruckdaten und die Authentifizierung von Benutzern mit diesen Informationen verantwortlich. Laut Apple verlassen Gesichts- und Fingerabdruckdaten das Gerät nicht und werden nicht in iCloud gesichert. Apps interagieren mit der Secure Enclave über die lokale Authentifizierungs-API und können keine Gesichts- oder Fingerabdruckdaten abrufen oder direkt auf die Secure Enclave zugreifen.
Touch-ID und Gesichtserkennungs-ID können von Apps verwendet werden, um einen Benutzer zu authentifizieren, bevor sie Zugriff auf geschützte Inhalte gewähren.
Kontext der lokalen Authentifizierung
Die biometrische Authentifizierung unter iOS basiert auf einem lokalen Authentifizierungskontextobjekt, bei dem es sich um ein instance der LAContext
Klasse handelt. Die LAContext
-Klasse ermöglicht Folgendes:
- Überprüfen Sie die Verfügbarkeit biometrischer Hardware.
- Authentifizierungsrichtlinien auswerten.
- Werten Sie Zugriffssteuerungen aus.
- Anpassen und Anzeigen von Authentifizierungsaufforderungen
- Wiederverwenden oder Ungültigieren eines Authentifizierungsstatus.
- Anmeldeinformationen verwalten.
Erkennen verfügbarer Authentifizierungsmethoden
Das Beispielprojekt enthält eine AuthenticationView
, die von einem AuthenticationViewController
unterstützt wird. Diese Klasse überschreibt die ViewWillAppear
Methode, um verfügbare Authentifizierungsmethoden zu erkennen:
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);
}
}
Die ViewWillAppear
-Methode wird aufgerufen, wenn die Benutzeroberfläche dem Benutzer angezeigt werden soll. Diese Methode definiert eine neue instance von LAContext
und verwendet die -Methode, um zu bestimmen, ob die CanEvaluatePolicy
biometrische Authentifizierung aktiviert ist. Wenn ja, überprüft es die Systemversion und BiometryType
-Enumeration, um zu ermitteln, welche biometrischen Optionen verfügbar sind.
Wenn die biometrische Authentifizierung nicht aktiviert ist, versucht die App, auf die PIN-Authentifizierung zurückzugreifen. Wenn weder biometrische noch PIN-Authentifizierung verfügbar sind, hat der Gerätebesitzer keine Sicherheitsfeatures aktiviert, und Inhalte können nicht durch die lokale Authentifizierung geschützt werden.
Authentifizieren eines Benutzers
Das AuthenticationViewController
im Beispielprojekt enthält eine AuthenticateMe
Methode, die für die Authentifizierung des Benutzers verantwortlich ist:
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);
}
}
}
Die AuthenticateMe
-Methode wird aufgerufen, als Reaktion darauf, dass der Benutzer auf eine Anmeldeschaltfläche tippt. Ein neues LAContext
Objekt wird instanziiert, und die Geräteversion wird überprüft, um zu bestimmen, welche Eigenschaften für den lokalen Authentifizierungskontext festgelegt werden sollen.
Die CanEvaluatePolicy
Methode wird aufgerufen, um zu überprüfen, ob die biometrische Authentifizierung aktiviert ist, falls möglich, auf die PIN-Authentifizierung zurückzugreifen und schließlich einen ungesicherten Modus anzubieten, wenn keine Authentifizierung verfügbar ist. Wenn eine Authentifizierungsmethode verfügbar ist, wird die EvaluatePolicy
Methode verwendet, um die Benutzeroberfläche anzuzeigen und den Authentifizierungsprozess abzuschließen.
Das Beispielprojekt enthält Mockdaten und eine Ansicht zum Anzeigen der Daten bei erfolgreicher Authentifizierung.
Verwandte Links
- Beispiel für die lokale Authentifizierung mithilfe von Touch ID oder Gesichts-ID
- Informationen zu Touch ID auf support.apple.com
- Informationen zur Gesichts-ID auf support.apple.com