Аутентификация с помощью Pin или Pattern, если отпечаток пальца не найден Android - PullRequest
0 голосов
/ 10 апреля 2020

Я использую метод биометрии c, чтобы разблокировать мое приложение. Но если пользователь отключил отпечаток пальца или пользователь использует устройство, которое не поддерживает отпечаток пальца, как я могу использовать для них проверку подлинности с помощью пин-кода или шаблона.

Я использовал keyguardmanager раньше, в 2018 году, и у меня сработало, что если у пользователя нет настроек отпечатка пальца или нет аппаратного обеспечения для снятия отпечатков пальцев, диспетчер клавиатуры автоматически запрашивает другой метод аутентификации по умолчанию. Я хочу использовать то же самое здесь.

Это код, который я использую в xamarin. android.

public void SetAuth()
    {
        try
        {
            KeyguardManager keyguardManager = (KeyguardManager)Activity.GetSystemService(Service.KeyguardService);
            BiometricPrompt biometricManager = new BiometricPrompt.Builder(Activity)
            .SetDescription("Authorization required to access data")// TODO: 
            .SetTitle("Access Data")// TODO:
            .SetNegativeButton("Cancel", Activity.MainExecutor, this)
            .SetSubtitle("").Build();//(BiometricPrompt)Activity.GetSystemService(Service.FingerprintService);
            if (ActivityCompat.CheckSelfPermission(Activity, Manifest.Permission.UseBiometric)
                != (int)Android.Content.PM.Permission.Granted)
            {
                ActivityCompat.RequestPermissions(Activity, new string[] { Manifest.Permission.UseBiometric }, 1);
                return; 
            }
            if (!keyguardManager.IsKeyguardSecure)
            {
                Helper.DialogBox(Activity, Activity.ApplicationContext, "Lock screen security not enable in Settings", null);
            }
            else
                GenKey();
            if (CipherInit())
            {
                BiometricPrompt.CryptoObject cryptoObject = new BiometricPrompt.CryptoObject(cipher);
                FingerprintHandler handler = new FingerprintHandler(Activity, this);
                handler.StartAuthentication(biometricManager, cryptoObject);
            }

        }
        catch (System.Exception ex)
        {
            ErrorLog(Params.Main_error, ex.Message + " :: " + ex.StackTrace, Params.AppInternalIssue_code);
        }

    }
private bool CipherInit()
        {
            try
            {
                cipher = Cipher.GetInstance(KeyProperties.KeyAlgorithmAes
                    + "/"
                    + KeyProperties.BlockModeCbc
                    + "/"
                    + KeyProperties.EncryptionPaddingPkcs7);
                keyStore.Load(null);
                IKey key = (IKey)keyStore.GetKey(KEY_NAME, null);
                cipher.Init(CipherMode.EncryptMode, key);
                return true;
            }
            catch (System.Exception ex) {
                return false;
            }
        }



private void GenKey()
        {
            keyStore = KeyStore.GetInstance("AndroidKeyStore");
            KeyGenerator keyGenerator = null;
            keyGenerator = KeyGenerator.GetInstance(KeyProperties.KeyAlgorithmAes, "AndroidKeyStore");
            keyStore.Load(null);
            keyGenerator.Init(new KeyGenParameterSpec.Builder(KEY_NAME, KeyStorePurpose.Encrypt | KeyStorePurpose.Decrypt)
                .SetBlockModes(KeyProperties.BlockModeCbc)
                .SetUserAuthenticationRequired(true)
                .SetEncryptionPaddings(KeyProperties
                .EncryptionPaddingPkcs7).Build());
            keyGenerator.GenerateKey();
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...