共用方式為


搭配 Xamarin.iOS 使用觸控標識碼和臉部標識碼

iOS 支援兩個生物特徵辨識驗證系統:

  1. 觸控標識碼 會使用 [首頁] 按鈕下的指紋感測器。
  2. 臉部標識碼 會使用正面相機感測器來驗證用戶臉部掃描。

觸控標識碼是在iOS 7中引進的,而iOS 11中的臉部標識碼。

這些驗證系統依賴稱為 安全記憶體保護區的硬體型安全性處理器。 安全記憶體保護區負責加密臉部和指紋數據的數學表示法,以及使用此資訊驗證使用者。 根據 Apple 的說法,臉部和指紋數據不會離開裝置,也不會備份到 iCloud。 應用程式會透過 本機驗證 API 與安全記憶體保護區互動,且無法擷取臉部或指紋數據,或直接存取安全記憶體保護區。

在提供受保護內容的存取權之前,應用程式可以使用觸控標識碼和臉部標識碼來驗證使用者。

本機驗證內容

iOS 上的生物特徵辨識驗證依賴本機 驗證內容 物件,這是 類別的 LAContext 實例。 類別 LAContext 可讓您:

  • 檢查生物特徵辨識硬體的可用性。
  • 評估驗證原則。
  • 評估訪問控制。
  • 自定義並顯示驗證提示。
  • 重複使用或使驗證狀態失效。
  • 管理認證。

偵測可用的驗證方法

範例專案包含 AuthenticationViewAuthenticationViewController支援的 。 這個類別會 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);
    }
}

ViewWillAppear UI即將向用戶顯示時,會呼叫 方法。 這個方法會定義 的新實例 LAContext ,並使用 CanEvaluatePolicy 方法來判斷是否已啟用生物特徵辨識驗證。 如果是,它會檢查系統版本和 BiometryType 列舉,以判斷有哪些生物特徵辨識選項可供使用。

如果未啟用生物特徵辨識驗證,應用程式會嘗試回復為 PIN 驗證。 如果生物特徵辨識和 PIN 驗證都無法使用,裝置擁有者尚未啟用安全性功能,且無法透過本機驗證保護內容。

驗證使用者

AuthenticationViewController範例專案中的 包含負責AuthenticateMe驗證使用者的方法:

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

呼叫 AuthenticateMe 方法,以回應用戶點選 [登入 ] 按鈕。 新的 LAContext 物件會具現化,並檢查裝置版本,以判斷在本機驗證內容上設定的屬性。

呼叫 CanEvaluatePolicy 方法以檢查生物特徵辨識驗證是否已啟用、可能的話回復為 PIN 驗證,最後如果沒有可用的驗證,則提供不安全模式。 如果有可用的驗證方法,則會 EvaluatePolicy 使用 方法來顯示 UI 並完成驗證程式。

範例專案包含模擬數據和檢視,以在驗證成功時顯示數據。