Použití Touch ID a ID obličeje pomocí Xamarin. iOSUse Touch ID and Face ID with Xamarin.iOS

Stažení ukázky stažení ukázkyDownload Sample Download the sample

iOS podporuje dva systémy biometrického ověřování:iOS supports two biometric authentication systems:

  1. Dotykový identifikátor používá senzor otisku prstu pod tlačítkem domů.Touch ID uses a fingerprint sensor under the Home button.
  2. ID obličeje používá k ověřování uživatelů pomocí prověřování obličeje přední senzory fotoaparátu.Face ID uses front-facing camera sensors to authenticate users with a facial scan.

Touch ID bylo představeno v iOS 7 a ID obličeje v iOS 11.Touch ID was introduced in iOS 7 and Face ID in iOS 11.

Tyto ověřovací systémy využívají procesor zabezpečení založený na hardwaru, který se nazývá Secure enklávy.These authentication systems rely on a hardware-based security processor called the Secure Enclave. Zabezpečený enklávy zodpovídá za šifrování matematických reprezentace dat obličeje a otisků prstů a ověřování uživatelů pomocí těchto informací.The Secure Enclave is responsible for encrypting mathematical representations of face and fingerprint data, and authenticating users using this information. Vzhledem k tomu, že data ze zařízení Apple, obličeje a otisk prstů zařízení neopustí a nejsou zálohována do iCloud.According to Apple, face and fingerprint data do not leave the device and are not backed up to iCloud. Aplikace komunikují s zabezpečeným enklávy prostřednictvím rozhraní API pro místní ověřování a nemůžou získat data o obličejích nebo otiskech prstů nebo získat přímý přístup k zabezpečení enklávy.Apps interact with the Secure Enclave through the Local Authentication API and cannot retrieve face or fingerprint data or directly access the Secure Enclave.

Dotykové ID a ID obličeje můžou aplikace používat k ověření uživatele před poskytnutím přístupu k chráněnému obsahu.Touch ID and Face ID can be used by apps to authenticate a user before providing access to protected content.

Místní kontext ověřováníLocal authentication context

Biometrická ověřování v iOS spoléhá na objekt místního kontextu ověřování , který je instancí LAContext třídy.Biometric authentication on iOS relies on a local authentication context object, which is an instance of the LAContext class. LAContextTřída vám umožní:The LAContext class allows you to:

  • Ověřte dostupnost biometrického hardwaru.Check the availability of biometric hardware.
  • Vyhodnotit zásady ověřování.Evaluate authentication policies.
  • Vyhodnoťte ovládací prvky přístupu.Evaluate access controls.
  • Přizpůsobte a zobrazte výzvy k ověření.Customize and display authentication prompts.
  • Opětovné použití nebo zrušení platnosti stavu ověřování.Reuse or invalidate an authentication state.
  • Spravujte přihlašovací údaje.Manage credentials.

Zjistit dostupné metody ověřováníDetect available authentication methods

Vzorový projekt obsahuje AuthenticationView zálohu AuthenticationViewController .The sample project includes an AuthenticationView backed by an AuthenticationViewController. Tato třída Přepisuje ViewWillAppear metodu pro detekci dostupných metod ověřování:This class overrides the ViewWillAppear method to detect available authentication methods:

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

ViewWillAppearMetoda je volána, když se uživatel přizpůsobuje zobrazení uživatelského rozhraní.The ViewWillAppear method is called when the UI is about to display to the user. Tato metoda definuje novou instanci třídy LAContext a používá CanEvaluatePolicy metodu k určení, jestli je povolené biometrické ověřování.This method defines a new instance of LAContext and uses the CanEvaluatePolicy method to determine if biometric authentication is enabled. Pokud ano, zkontroluje verzi systému a výčet a BiometryType určí, které možnosti biometriky jsou k dispozici.If so, it checks the system version and BiometryType enum to determine which biometric options are available.

Pokud není povolené biometrické ověřování, aplikace se pokusí přejít k ověřování PIN.If biometric authentication is not enabled, the app attempts to fall back to PIN authentication. Pokud není k dispozici biometrika ani ověřování PIN, vlastník zařízení nepovolil funkce zabezpečení a obsah nelze zabezpečit prostřednictvím místního ověřování.If neither biometric nor PIN authentication is available, the device owner has not enabled security features and content cannot be secured through local authentication.

Ověření uživateleAuthenticate a user

AuthenticationViewControllerV ukázkovém projektu obsahuje AuthenticateMe metodu, která zodpovídá za ověřování uživatele:The AuthenticationViewController in the sample project includes an AuthenticateMe method, which is responsible for authenticating the user:

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

AuthenticateMeMetoda je volána jako odpověď na tlačítko pro přihlášení uživatele klepnutím na tlačítko pro přihlášení .The AuthenticateMe method is called in response to the user tapping a Login button. Vytvoří LAContext se instance nového objektu a kontroluje se verze zařízení, aby se zjistilo, které vlastnosti se mají nastavit v kontextu místního ověřování.A new LAContext object is instantiated and the device version is checked to determine which properties to set on the local authentication context.

CanEvaluatePolicyMetoda je volána pro kontrolu, zda je povoleno biometrické ověřování, pokud je to možné, přejít zpět k ověřování PIN a nakonec nabídnout nezabezpečený režim, pokud není k dispozici žádné ověřování.The CanEvaluatePolicy method is called to check if biometric authentication is enabled, fall back to PIN authentication if possible, and finally offer an unsecured mode if no authentication is available. Pokud je k dispozici metoda ověřování, EvaluatePolicy Metoda slouží k zobrazení uživatelského rozhraní a dokončení procesu ověřování.If an authentication method is available, the EvaluatePolicy method is used to show the UI and complete the authentication process.

Vzorový projekt obsahuje vzorová data a zobrazení k zobrazení dat, pokud je ověřování úspěšné.The sample project contains mock data and a view to display the data if authentication is successful.