Verwenden von Touch-ID und Gesichts-ID mit Xamarin.iOS

iOS unterstützt zwei Biografie metrische Authentifizierungssysteme:

  1. Touch ID verwendet einen Fingerabdrucksensor unter der Home-Taste.
  2. 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.