Używanie funkcji Touch ID i face ID z platformą Xamarin.iOS

Download Sample Pobieranie przykładu

System iOS obsługuje dwa systemy uwierzytelniania biometrycznego:

  1. Funkcja Touch ID używa czujnika linii papilarnych pod przyciskiem Strona główna.
  2. Funkcja Face ID używa przednich czujników aparatów do uwierzytelniania użytkowników za pomocą skanowania twarzy.

Funkcja Touch ID została wprowadzona w systemach iOS 7 i Face ID w systemie iOS 11.

Te systemy uwierzytelniania korzystają z procesora zabezpieczeń opartego na sprzęcie nazywanego bezpieczną enklawą. Bezpieczna enklawa jest odpowiedzialna za szyfrowanie matematycznych reprezentacji danych twarzy i odcisków palców oraz uwierzytelnianie użytkowników przy użyciu tych informacji. Według firmy Apple dane twarzy i odcisków palców nie opuszczają urządzenia i nie są kopiami zapasowymi w usłudze iCloud. Aplikacje współdziałają z bezpieczną enklawą za pośrednictwem interfejsu API uwierzytelniania lokalnego i nie mogą pobierać danych twarzy lub odcisków palców ani bezpośrednio uzyskiwać dostępu do bezpiecznej enklawy.

Funkcje Touch ID i Face ID mogą być używane przez aplikacje do uwierzytelniania użytkownika przed zapewnieniem dostępu do chronionej zawartości.

Kontekst uwierzytelniania lokalnego

Uwierzytelnianie biometryczne w systemie iOS opiera się na lokalnym obiekcie kontekstu uwierzytelniania, który jest wystąpieniem LAContext klasy. Klasa LAContext umożliwia:

  • Sprawdź dostępność sprzętu biometrycznego.
  • Ocena zasad uwierzytelniania.
  • Ocena kontroli dostępu.
  • Dostosowywanie i wyświetlanie monitów o uwierzytelnienie.
  • Ponowne użycie lub unieważnienie stanu uwierzytelniania.
  • Zarządzanie poświadczeniami.

Wykrywanie dostępnych metod uwierzytelniania

Przykładowy projekt zawiera element AuthenticationView wspierany przez element AuthenticationViewController. Ta klasa zastępuje metodę wykrywania ViewWillAppear dostępnych metod uwierzytelniania:

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);
    }
}

Metoda ViewWillAppear jest wywoływana, gdy interfejs użytkownika ma być wyświetlany użytkownikowi. Ta metoda definiuje nowe wystąpienie LAContext klasy i używa CanEvaluatePolicy metody w celu określenia, czy włączono uwierzytelnianie biometryczne. Jeśli tak, sprawdza wersję systemu i BiometryType wyliczenie, aby określić, które opcje biometryczne są dostępne.

Jeśli uwierzytelnianie biometryczne nie jest włączone, aplikacja próbuje wrócić do uwierzytelniania przy użyciu numeru PIN. Jeśli nie jest dostępne ani uwierzytelnianie biometryczne, ani numer PIN, właściciel urządzenia nie włączył funkcji zabezpieczeń i nie można zabezpieczyć zawartości za pośrednictwem uwierzytelniania lokalnego.

Uwierzytelnianie użytkownika

Element AuthenticationViewController w przykładowym projekcie zawiera metodę AuthenticateMe , która jest odpowiedzialna za uwierzytelnianie użytkownika:

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);
        }
    } 
}

Metoda jest wywoływana AuthenticateMe w odpowiedzi na naciśnięcie przycisku Logowania przez użytkownika. LAContext Nowy obiekt jest tworzone, a wersja urządzenia jest sprawdzana, aby określić, które właściwości mają być ustawione w kontekście uwierzytelniania lokalnego.

Metoda CanEvaluatePolicy jest wywoływana w celu sprawdzenia, czy uwierzytelnianie biometryczne jest włączone, wróć do uwierzytelniania przy użyciu numeru PIN, jeśli jest to możliwe, i w końcu oferuje tryb niezabezpieczony, jeśli nie jest dostępne uwierzytelnianie. Jeśli dostępna jest metoda uwierzytelniania, EvaluatePolicy metoda jest używana do wyświetlania interfejsu użytkownika i ukończenia procesu uwierzytelniania.

Przykładowy projekt zawiera pozorne dane i widok umożliwiający wyświetlenie danych w przypadku pomyślnego uwierzytelnienia.