Xamarin.iOS ile Touch ID ve Face ID kullanma

Örneği İndir Örneği indirme

iOS iki biyometrik kimlik doğrulama sistemi destekler:

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

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

Bu kimlik doğrulama sistemleri, Güvenli Enclave adlı donanım tabanlı bir güvenlik işlemcisini kullanır. Güvenli Enclave, yüz ve parmak izi verilerinin matematiksel temsillerini şifrelemek ve bu bilgileri kullanarak kullanıcıların kimliklerini doğrulamakla sorumludur. Apple'a göre yüz ve parmak izi verileri cihazdan ayrılmaz ve iCloud'a yedeklemez. Uygulamalar, Yerel Kimlik Doğrulama API'si aracılığıyla Güvenli Enclave ile etkileşime geçerek yüz veya parmak izi verilerini alama ya da Güvenli Enclave'e doğrudan erişamaz.

Touch ID ve Face ID, korunan 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ın bir örneği olan yerel kimlik doğrulama bağlamı nesnesini kullanır. sınıfı LAContext şunları sağlar:

  • Biyometrik donanımın kullanılabilirliğini denetleme.
  • Kimlik doğrulama ilkelerini değerlendirme.
  • Erişim denetimlerini değerlendirme.
  • Kimlik doğrulama istemlerini özelleştirme ve görüntüleme.
  • Kimlik doğrulama durumunu yeniden kullanın veya geçersiz kılın.
  • Kimlik bilgilerini yönetme.

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

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

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 hakkında olduğunda yöntemi çağrılır. Bu yöntem yeni bir örneğini tanımlar LAContext ve biyometrik CanEvaluatePolicy kimlik doğrulamasının etkin olup olmadığını belirlemek için yöntemini kullanır. Varsa, hangi biyometrik seçeneklerin kullanılabilir BiometryType olduğunu belirlemek için sistem sürümünü ve enum'u denetler.

Biyometrik kimlik doğrulaması etkinleştirilmezse, uygulama PIN kimlik doğrulamasına geri dönmek için çalışır. Biyometrik veya PIN kimlik doğrulaması kullanılamıyorsa, cihaz sahibi güvenlik özelliklerini etkinleştirmemiş ve içeriğin güvenliği yerel kimlik doğrulaması aracılığıyla sağlanmaz.

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

Örnek AuthenticationViewController projesinde, kullanıcının AuthenticateMe kimlik doğrulamadan sorumlu olduğu bir yöntemi vardır:

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ç düğmesine dokunması üzerine AuthenticateMe Yeni bir nesne örneği hazırlar ve yerel kimlik doğrulama bağlamında hangi özelliklerin ayarlandırılıp LAContext ayarlanmayacaklarını belirlemek için cihaz sürümü denetlenir.

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

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