Xamarin.iOS ile Touch ID ve Face ID kullanma
iOS iki biyometrik kimlik doğrulama sistemini destekler:
- Touch ID , Giriş düğmesinin altında bir parmak izi sensörü kullanır.
- 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 AuthenticationViewController
iç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.
İlgili bağlantılar
- support.apple.com'da Touch ID hakkında
- support.apple.com'da Face ID hakkında