Verwenden von Touch ID und Gesichtserkennung mit Xamarin.iOS

Beispiel herunterladen Das Beispiel herunterladen

iOS unterstützt zwei biometrische Authentifizierungssysteme:

  1. Touch ID verwendet einen Fingerabdrucksensor unter der Starttaste.
  2. 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 AuthenticationViewControllerunterstü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.