Aracılığıyla paylaş


Xamarin.iOS ile Touch ID ve Face ID kullanma

iOS iki biyometrik kimlik doğrulama sistemini destekler:

  1. Touch ID , Giriş düğmesinin altında bir parmak izi sensörü kullanır.
  2. Face ID , yüz taramasıyla kullanıcıların kimliğini doğrulamak için ön kamera algılayıcılarını kullanır.

Touch ID, iOS 7'de ve iOS 11'de Face ID'de tanıtıldı.

Bu kimlik doğrulama sistemleri, Secure Enclave adlı donanım tabanlı bir güvenlik işlemcisine dayanır. Güvenli Kapanım, yüz ve parmak izi verilerinin matematiksel temsillerini şifrelemek ve bu bilgileri kullanarak kullanıcıların kimliğini doğrulamakla sorumludur. Apple'a göre, yüz ve parmak izi verileri cihazdan ayrılmaz ve iCloud'a yedeklenmez. Uygulamalar Yerel Kimlik Doğrulama API'si aracılığıyla Güvenli Kapanım ile etkileşim kurar ve yüz veya parmak izi verilerini alamaz ya da Güvenli Kapanım'a doğrudan erişemez.

Touch ID ve Face ID, korumalı içeriğe erişim sağlamadan önce bir kullanıcının kimliğini doğrulamak için uygulamalar tarafından kullanılabilir.

Yerel kimlik doğrulama bağlamı

iOS'ta biyometrik kimlik doğrulaması, sınıfın bir örneği olan yerel kimlik doğrulama bağlam nesnesine LAContext dayanır. LAContext sınıfı şunları yapmanızı sağlar:

  • Biyometrik donanımın kullanılabilirliğini denetleyin.
  • Kimlik doğrulama ilkelerini değerlendirme.
  • Erişim denetimlerini değerlendirme.
  • Kimlik doğrulama istemlerini özelleştirin ve görüntüleyin.
  • Kimlik doğrulama durumunu yeniden kullanma veya geçersiz kılma.
  • Kimlik bilgilerini yönetin.

Kullanılabilir kimlik doğrulama yöntemlerini algılama

Örnek proje, tarafından AuthenticationView yedeklenen bir AuthenticationViewControlleriçerir. Bu sınıf, kullanılabilir kimlik doğrulama yöntemlerini algılamak için yöntemini geçersiz kılar ViewWillAppear :

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

Kullanıcı ViewWillAppear arabirimi kullanıcıya görüntülenmek üzereyken yöntemi çağrılır. Bu yöntem yeni bir örneğini LAContext tanımlar ve biyometrik kimlik doğrulamasının CanEvaluatePolicy etkinleştirilip etkinleştirilmediğini belirlemek için yöntemini kullanır. Bu durumda, hangi biyometrik seçeneklerin kullanılabilir olduğunu belirlemek için sistem sürümünü ve BiometryType numaralandırmasını denetler.

Biyometrik kimlik doğrulaması etkin değilse, uygulama PIN kimlik doğrulamasına geri dönmeye çalışır. Biyometrik veya PIN kimlik doğrulaması kullanılamıyorsa, cihaz sahibi güvenlik özelliklerini etkinleştirmemiştir ve içerik yerel kimlik doğrulaması aracılığıyla güvenli hale getirilemez.

Kullanıcının kimliğini doğrulama

AuthenticationViewController Örnek projede, kullanıcının kimliğini doğrulamakla sorumlu olan bir AuthenticateMe yöntem bulunur:

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

Yöntemi AuthenticateMe , kullanıcının oturum açma düğmesine dokunmasına yanıt olarak çağrılır. Yeni LAContext bir nesne örneği oluşturulur ve yerel kimlik doğrulama bağlamında ayarlanacağı özellikleri belirlemek için cihaz sürümü denetlendi.

Biyometrik kimlik doğrulamasının CanEvaluatePolicy etkinleştirilip etkinleştirilmediğini denetlemek, mümkünse PIN kimlik doğrulamasına geri dönmek ve son olarak kullanılabilir kimlik doğrulaması yoksa güvenli olmayan bir mod sunmak için yöntemi çağrılır. Bir kimlik doğrulama yöntemi varsa, kullanıcı arabirimini EvaluatePolicy göstermek ve kimlik doğrulama işlemini tamamlamak için yöntemi kullanılır.

Örnek proje sahte veriler ve kimlik doğrulaması başarılı olursa verileri görüntülemek için bir görünüm içerir.