Verwenden von Touch-ID und Gesichts-ID mit Xamarin.iOS
iOS unterstützt zwei Biografie metrische Authentifizierungssysteme:
- Touch ID verwendet einen Fingerabdrucksensor unter der Home-Taste.
- Die Gesichts-ID verwendet Kamerasensoren vorn, um Benutzer mit einem Gesichtsscan zu authentifizieren.
Touch-ID wurde in iOS 7 und Face ID in iOS 11 eingeführt.
Diese Authentifizierungssysteme basieren auf einem hardwarebasierten Sicherheitsprozessor, der als Secure Enklave bezeichnet wird. Die secure Enklave ist für die Verschlüsselung mathematischer Darstellungen von Gesichts- und Fingerabdruckdaten sowie für 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 Enklave über die lokale Authentifizierungs-API und können keine Gesichts- oder Fingerabdruckdaten abrufen oder direkt auf die sichere Enklave zugreifen.
Touch-ID und Gesichts-ID können von Apps verwendet werden, um einen Benutzer zu authentifizieren, bevor der Zugriff auf geschützte Inhalte bereitgestellt wird.
Lokaler Authentifizierungskontext
Die biometrische Authentifizierung für iOS basiert auf einem lokalen Authentifizierungskontextobjekt , bei dem es sich um eine Instanz der LAContext
Klasse handelt. Die LAContext
Klasse ermöglicht Folgendes:
- Überprüfen Sie die Verfügbarkeit Biografie metrischer Hardware.
- Evaluieren von Authentifizierungsrichtlinien.
- Auswerten von Zugriffssteuerelementen.
- Anpassen und Anzeigen von Authentifizierungsaufforderungen
- Verwenden oder ungültigen Authentifizierungsstatus.
- Verwalten von Anmeldeinformationen.
Erkennen verfügbarer Authentifizierungsmethoden
Das Beispielprojekt enthält eine AuthenticationView
sicherung durch ein AuthenticationViewController
. Diese Klasse setzt die ViewWillAppear
Methode außer Kraft, 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 wird. Diese Methode definiert eine neue Instanz von LAContext
und verwendet die CanEvaluatePolicy
Methode, um zu bestimmen, ob Biografie metrische Authentifizierung aktiviert ist. Wenn ja, überprüft sie die Systemversion und BiometryType
enumeration, um zu ermitteln, welche Biografie metrischen Optionen verfügbar sind.
Wenn Biografie metrische Authentifizierung nicht aktiviert ist, versucht die App, auf die PIN-Authentifizierung zurückzugreifen. Wenn weder Biografie metrische noch PIN-Authentifizierung verfügbar ist, hat der Gerätebesitzer keine Sicherheitsfeatures aktiviert, und Inhalte können nicht über die lokale Authentifizierung gesichert werden.
Authentifizieren eines Benutzers/einer Benutzerin
Das AuthenticationViewController
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 als Reaktion darauf aufgerufen, dass der Benutzer auf eineAnmeldeschaltflä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 Biografie metrische Authentifizierung aktiviert ist, falls möglich auf die PIN-Authentifizierung zurückgreifen und schließlich einen unsicheren Modus anbieten, 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 Simulierte Daten und eine Ansicht zum Anzeigen der Daten, wenn die Authentifizierung erfolgreich ist.
Verwandte Links
- Informationen zur Touch-ID auf support.apple.com
- Informationen zur Gesichts-ID auf support.apple.com