protected override async Task <FingerprintAuthenticationResult> NativeAuthenticateAsync(AuthenticationRequestConfiguration authRequestConfig, CancellationToken cancellationToken = new CancellationToken())
        {
            var result = new FingerprintAuthenticationResult();

            SetupContextProperties(authRequestConfig);

            Tuple <bool, NSError> resTuple;

            using (cancellationToken.Register(CancelAuthentication))
            {
                var policy = GetPolicy(authRequestConfig.AllowAlternativeAuthentication);
                resTuple = await _context.EvaluatePolicyAsync(policy, authRequestConfig.Reason);
            }

            if (resTuple.Item1)
            {
                result.Status = FingerprintAuthenticationResultStatus.Succeeded;
            }
            else
            {
                // #79 simulators return null for any reason
                if (resTuple.Item2 == null)
                {
                    result.Status       = FingerprintAuthenticationResultStatus.UnknownError;
                    result.ErrorMessage = "";
                }
                else
                {
                    result = GetResultFromError(resTuple.Item2);
                }
            }

            CreateNewContext();
            return(result);
        }
示例#2
0
 private void SetResultSafe(FingerprintAuthenticationResult result)
 {
     if (!(_taskCompletionSource.Task.IsCanceled || _taskCompletionSource.Task.IsCompleted || _taskCompletionSource.Task.IsFaulted))
     {
         _taskCompletionSource.SetResult(result);
     }
 }
示例#3
0
        public MainPage()
        {
            InitializeComponent();

            MasterBehavior = MasterBehavior.Popover;

            MenuPages.Add((int)MenuItemType.Browse, (NavigationPage)Detail);

            if (Device.RuntimePlatform != "UWP")
            {
                if (CrossFingerprint.Current.IsAvailableAsync().Result)
                {
                    Task <FingerprintAuthenticationResult> result = Task.Run(async() =>
                    {
                        AuthenticationRequestConfiguration conf = new AuthenticationRequestConfiguration("Login via Fingerprint", "Tap that fingerprint sensor!");

                        FingerprintAuthenticationResult oResult = await CrossFingerprint.Current.AuthenticateAsync(conf);

                        return(oResult);
                    });

                    if (result.Result.Authenticated)

                    {
                        DisplayAlert("Results are here", "Valid fingerprint found", "Ok");
                    }

                    else

                    {
                        DisplayAlert("Results are here", "Invalid fingerprint", "Ok");
                    }
                }
            }
        }
示例#4
0
        private async void BtnFingerPrint_Clicked(object sender, EventArgs e)
        {
            //Check if Fingerprint ID is available on mobile device.
            if (await CrossFingerprint.Current.IsAvailableAsync())
            {
                //If avaialbe authenticate by Fingerprint ID.
                FingerprintAuthenticationResult result = await CrossFingerprint.Current.AuthenticateAsync("Provide fingerprint to sign in.");

                //If authentication is successful continue to next page.
                if (result.Authenticated)
                {
                    int count = await UserRepository.GetRowCount();


                    if (count > 0)                     // If record count for User table is > 0 then an account exist
                    {
                        await Navigation.PushAsync(new Home());
                    }
                    else                     // If the record count is 0 then no User account exist
                    {
                        await Navigation.PushAsync(new SelectType());
                    }
                }
            }
            else
            {
                // If FingerprintID is NOT availabe on mobile device, display appropriate error message.
                await DisplayAlert("Authentication Not Possible", "Fingerprint authentication is not available on your device", "OK");
            }
        }
示例#5
0
        public void OnClick(IDialogInterface dialog, int which)
        {
            var faResult = new FingerprintAuthenticationResult {
                Status = FingerprintAuthenticationResultStatus.Canceled
            };

            SetResultSafe(faResult);
        }
示例#6
0
 internal static FingerprintResult From(FingerprintAuthenticationResult result)
 {
     return(new FingerprintResult
     {
         Status = Enum.Parse <FingerprintCheckStatus>(result.Status.ToString()),
         ErrorMessage = result.ErrorMessage
     });
 }
示例#7
0
        protected override async Task <FingerprintAuthenticationResult> NativeAuthenticateAsync(AuthenticationRequestConfiguration authRequestConfig, CancellationToken cancellationToken = new CancellationToken())
        {
            var result = new FingerprintAuthenticationResult();

            SetupContextProperties(authRequestConfig);

            Tuple <bool, NSError> resTuple;

            using (cancellationToken.Register(CancelAuthentication))
            {
                var policy = GetPolicy(authRequestConfig.AllowAlternativeAuthentication);
                resTuple = await _context.EvaluatePolicyAsync(policy, authRequestConfig.Reason);
            }

            if (resTuple.Item1)
            {
                result.Status = FingerprintAuthenticationResultStatus.Succeeded;
            }
            else
            {
                switch ((LAStatus)(int)resTuple.Item2.Code)
                {
                case LAStatus.AuthenticationFailed:
                    var description = resTuple.Item2.Description;
                    if (description != null && description.Contains("retry limit exceeded"))
                    {
                        result.Status = FingerprintAuthenticationResultStatus.TooManyAttempts;
                    }
                    else
                    {
                        result.Status = FingerprintAuthenticationResultStatus.Failed;
                    }
                    break;

                case LAStatus.UserCancel:
                case LAStatus.AppCancel:
                    result.Status = FingerprintAuthenticationResultStatus.Canceled;
                    break;

                case LAStatus.UserFallback:
                    result.Status = FingerprintAuthenticationResultStatus.FallbackRequested;
                    break;

                case LAStatus.TouchIDLockout:
                    result.Status = FingerprintAuthenticationResultStatus.TooManyAttempts;
                    break;

                default:
                    result.Status = FingerprintAuthenticationResultStatus.UnknownError;
                    break;
                }

                result.ErrorMessage = resTuple.Item2.LocalizedDescription;
            }

            CreateNewContext();
            return(result);
        }
示例#8
0
        public override void OnAuthenticationSucceeded(BiometricPrompt.AuthenticationResult result)
        {
            base.OnAuthenticationSucceeded(result);
            var faResult = new FingerprintAuthenticationResult {
                Status = FingerprintAuthenticationResultStatus.Succeeded
            };

            SetResultSafe(faResult);
        }
        // https://developer.android.com/reference/android/hardware/fingerprint/FingerprintManager.AuthenticationCallback.html
        public override void OnAuthenticationSucceeded(FingerprintManager.AuthenticationResult res)
        {
            base.OnAuthenticationSucceeded(res);
            var result = new FingerprintAuthenticationResult {
                Status = FingerprintAuthenticationResultStatus.Succeeded
            };

            SetResultSafe(result);
        }
示例#10
0
 private async Task SetResultAsync(FingerprintAuthenticationResult result)
 {
     if (result.Authenticated)
     {
         App.Current.MainPage = new CustomNavigationPage(new MainPage());//跳转页面
     }
     else
     {
     }
 }
示例#11
0
        private async void Dismiss(FingerprintAuthenticationResult result, bool animation = true)
        {
            if (animation)
            {
                await AnimateResultAsync(result.Status);
            }

            _resultTaskCompletionSource.SetResult(result);
            Dismiss();
        }
示例#12
0
        // Do not cancel the dialog on error.
        // TODO: Implement feedback (shaking icon, display text, ...)
        //public override void OnAuthenticationFailed()
        //{
        //    base.OnAuthenticationFailed();
        //    var result = new FingerprintAuthenticationResult { Status = FingerprintAuthenticationResultStatus.UnknownError };
        //    SetResultSafe(result);
        //}

        public override void OnAuthenticationError(FingerprintState errorCode, ICharSequence errString)
        {
            base.OnAuthenticationError(errorCode, errString);
            var message = errString != null?errString.ToString() : string.Empty;

            var result = new FingerprintAuthenticationResult {
                Status = FingerprintAuthenticationResultStatus.Failed, ErrorMessage = message
            };

            SetResultSafe(result);
        }
示例#13
0
 private async Task SetResultAsync(FingerprintAuthenticationResult result)
 {
     if (result.Authenticated)
     {
         _navService.NavigateTo(ViewModelLocator.Master, CurrentUser);
     }
     else
     {
         await UserDialogs.Instance.AlertAsync("Invalid pattern detected !");
     }
 }
 private async Task SetResultAsync(FingerprintAuthenticationResult result)
 {
     if (result.Authenticated)
     {
         await Navigation.PushAsync(new SecretView());
     }
     else
     {
         lblStatus.Text = $"{result.Status}: {result.ErrorMessage}";
     }
 }
示例#15
0
 public void SetResultAsync(FingerprintAuthenticationResult result)
 {
     if (result.Authenticated)
     {
         fingerPrintValidate = true;
     }
     else
     {
         fingerPrintValidate = false;
     }
 }
 private async Task SetResultAsync(FingerprintAuthenticationResult result)
 {
     if (result.Authenticated)
     {
         await DisplayAlert("FingerPrint Sample", "Success", "Ok");
     }
     else
     {
         await DisplayAlert("FingerPrint Sample", result.ErrorMessage, "Ok");
     }
 }
示例#17
0
        private async void Dismiss(FingerprintAuthenticationResult result, bool animation = true)
        {
            DetachEventHandlers();
            if (animation)
            {
                // HideHelpText();
                await AnimateResultAsync(result.Status);
            }

            _resultTaskCompletionSource.TrySetResult(result);
            DismissAllowingStateLoss();
        }
        // Set authentication Result
        private async Task SetResultAsync(FingerprintAuthenticationResult result)
        {
            if (result.Authenticated)
            {
                await DisplayAlert("Success", "Fingerprint success", "OK");

                lblStatus.Text = result.Status.ToString();
            }
            else
            {
                lblStatus.Text = $"{result.Status}: {result.ErrorMessage}";
            }
        }
示例#19
0
        private Task SetResultAsync(FingerprintAuthenticationResult result)
        {
            if (result.Authenticated)
            {
                performUnlock();
            }
            else
            {
                _ = displaySpixiAlert(SpixiLocalization._SL("global-lock-invalidpassword-title"), SpixiLocalization._SL("global-lock-invalidpassword-text"), "Cancel");
            }

            return(Task.CompletedTask);
        }
示例#20
0
        private async void BtnAuthenticate_Clicked(object sender, EventArgs e)
        {
            FingerprintAuthenticationResult result = await CrossFingerprint.Current.AuthenticateAsync("Tap the fingerprint sensor");

            if (result.Authenticated)
            {
                LblAuthenticate.Text      = "VALIDATION DONE";
                LblAuthenticate.TextColor = Color.Green;
            }
            else
            {
                LblAuthenticate.Text      = "VALIDATION FAILED";
                LblAuthenticate.TextColor = Color.Red;
            }
        }
示例#21
0
        private async Task SetResultAsync(FingerprintAuthenticationResult result)
        {
            if (result.Authenticated)
            {
                var alert = Application.Current.MainPage.DisplayAlert("Fingerprint scan successful", "Your fingerprint scan was successful.", "OK");
                //Debug.WriteLine($"_url = {_url}");
                //Application.Current.MainPage = new WebViewArgsPage(_url);
            }
            else
            {
                Debug.WriteLine($"Error in Fingerprint Scan");
                Debug.WriteLine($"{result.ErrorMessage}");

                //var alert = Application.Current.MainPage.DisplayAlert("Fingerprint scan failed", $"{result.ErrorMessage}", "OK");
            }
        }
        private FingerprintAuthenticationResult GetResultFromError(NSError error)
        {
            var result = new FingerprintAuthenticationResult();

            switch ((LAStatus)(int)error.Code)
            {
            case LAStatus.AuthenticationFailed:
                var description = error.Description;
                if (description != null && description.Contains("retry limit exceeded"))
                {
                    result.Status = FingerprintAuthenticationResultStatus.TooManyAttempts;
                }
                else
                {
                    result.Status = FingerprintAuthenticationResultStatus.Failed;
                }
                break;

            case LAStatus.UserCancel:
            case LAStatus.AppCancel:
                result.Status = FingerprintAuthenticationResultStatus.Canceled;
                break;

            case LAStatus.UserFallback:
                result.Status = FingerprintAuthenticationResultStatus.FallbackRequested;
                break;

            case LAStatus.TouchIDLockout:
                result.Status = FingerprintAuthenticationResultStatus.TooManyAttempts;
                break;

            case LAStatus.BiometryNotAvailable:
                // this can happen if it was available, but the user didn't allow face ID
                result.Status = IsDeniedError(error) ?
                                FingerprintAuthenticationResultStatus.Denied :
                                FingerprintAuthenticationResultStatus.NotAvailable;
                break;

            default:
                result.Status = FingerprintAuthenticationResultStatus.UnknownError;
                break;
            }

            result.ErrorMessage = error.LocalizedDescription;

            return(result);
        }
示例#23
0
        private async Task SetResultAsync(FingerprintAuthenticationResult result)
        {
            if (result.Authenticated)
            {
                if (SecureStorage.GetAsync(App.FingerPass).Result == null)
                {
                    if (SecureStorage.GetAsync(App.PasswordPass).Result == null)
                    {
                        App.LoginMethod        = Enums.LoginMethodEnum.Fingerprint;
                        CreateButton.IsVisible = false;
                        await Navigation.PushAsync(new NotePage()).ConfigureAwait(true);
                    }
                    else
                    {
                        var hash = Crypto.ComputeSHA512Hash(PasswordEntry.Text);
                        try
                        {
                            string savedHash = await SecureStorage.GetAsync(key).ConfigureAwait(true);

                            if (savedHash == hash)
                            {
                                App.PassText       = PasswordEntry.Text;
                                PasswordEntry.Text = "";
                                App.LoginMethod    = Enums.LoginMethodEnum.Fingerprint;
                                await Navigation.PushAsync(new NotePage()).ConfigureAwait(true);
                            }
                            else
                            {
                                PasswordEntry.Text = "";
                                await DisplayAlert("Error", "Please provide correct password", "Ok");
                            }
                        }
                        catch (Exception ex) { }
                    }
                }
                else
                {
                    App.LoginMethod = Enums.LoginMethodEnum.Fingerprint;
                    await Navigation.PushAsync(new NotePage()).ConfigureAwait(true);
                }
            }
            else
            {
                await DisplayAlert("Finger not found :(", result.ErrorMessage, "Ok");
            }
        }
示例#24
0
        public override void OnAuthenticationError(int errorCode, ICharSequence errString)
        {
            base.OnAuthenticationError(errorCode, errString);

            var message = errString != null?errString.ToString() : string.Empty;

            var result = new FingerprintAuthenticationResult {
                Status = FingerprintAuthenticationResultStatus.Failed, ErrorMessage = message
            };

            if (errorCode == BiometricPrompt.InterfaceConsts.ErrorLockout)
            {
                result.Status = FingerprintAuthenticationResultStatus.TooManyAttempts;
            }

            SetResultSafe(result);
        }
        private void SetResult(FingerprintAuthenticationResult result)
        {
            if (result.Authenticated)
            {
                var alert = new NSAlert
                {
                    AlertStyle      = NSAlertStyle.Informational,
                    MessageText     = "Success",
                    InformativeText = "You have Fingers!"
                };

                alert.BeginSheet(this.View.Window);
            }
            else
            {
                lblStatus.StringValue = $"{result.Status}: {result.ErrorMessage}";
            }
        }
        public async Task <FingerprintAuthenticationResult> AuthenticateAsync(string reason, CancellationToken cancellationToken)
        {
            var result = new FingerprintAuthenticationResult();

            cancellationToken.Register(CancelAuthentication);

            if (!IsAvailable)
            {
                result.Status = FingerprintAuthenticationResultStatus.NotAvailable;
                return(result);
            }

            var resTuple = await _context.EvaluatePolicyAsync(LAPolicy.DeviceOwnerAuthenticationWithBiometrics, reason);

            if (resTuple.Item1)
            {
                result.Status = FingerprintAuthenticationResultStatus.Succeeded;
            }
            else
            {
                switch ((LAStatus)(int)resTuple.Item2.Code)
                {
                case LAStatus.AuthenticationFailed:
                    result.Status = FingerprintAuthenticationResultStatus.Failed;
                    break;

                case LAStatus.UserCancel:
                    result.Status = FingerprintAuthenticationResultStatus.Canceled;
                    break;

                case LAStatus.UserFallback:
                    result.Status = FingerprintAuthenticationResultStatus.FallbackRequested;
                    break;

                default:
                    result.Status = FingerprintAuthenticationResultStatus.UnknownError;
                    break;
                }

                result.ErrorMessage = resTuple.Item2.LocalizedDescription;
            }

            return(result);
        }
示例#27
0
 private async Task SetResultAsync(FingerprintAuthenticationResult result)
 {
     if (result.Authenticated)
     {
         Android.App.AlertDialog.Builder dialog = new Android.App.AlertDialog.Builder(this);
         Android.App.AlertDialog         alert  = dialog.Create();
         alert.SetTitle("Xamarin Android FingerPrint Sample");
         alert.SetMessage("Success");
         alert.Show();
     }
     else
     {
         Android.App.AlertDialog.Builder dialog = new Android.App.AlertDialog.Builder(this);
         Android.App.AlertDialog         alert  = dialog.Create();
         alert.SetTitle("Xamarin Android FingerPrint Sample");
         alert.SetMessage("Failed");
         alert.Show();
     }
 }
示例#28
0
        public async Task <FingerprintAuthenticationResult> AuthenticateAsync(string reason, CancellationToken cancellationToken)
        {
            var result = new FingerprintAuthenticationResult();

            try
            {
                var verificationResult = await UserConsentVerifier.RequestVerificationAsync(reason);

                switch (verificationResult)
                {
                case UserConsentVerificationResult.Verified:
                    result.Status = FingerprintAuthenticationResultStatus.Succeeded;
                    break;

                case UserConsentVerificationResult.DeviceBusy:
                case UserConsentVerificationResult.DeviceNotPresent:
                case UserConsentVerificationResult.DisabledByPolicy:
                case UserConsentVerificationResult.NotConfiguredForUser:
                    result.Status = FingerprintAuthenticationResultStatus.NotAvailable;
                    break;

                case UserConsentVerificationResult.RetriesExhausted:
                    result.Status = FingerprintAuthenticationResultStatus.Failed;
                    break;

                case UserConsentVerificationResult.Canceled:
                    result.Status = FingerprintAuthenticationResultStatus.Canceled;
                    break;

                default:
                    result.Status = FingerprintAuthenticationResultStatus.NotAvailable;
                    break;
                }
            }
            catch (Exception ex)
            {
                result.Status       = FingerprintAuthenticationResultStatus.UnknownError;
                result.ErrorMessage = ex.Message;
            }

            return(result);
        }
        private FingerprintAuthenticationResult GetResultFromError(NSError error)
        {
            var result = new FingerprintAuthenticationResult();

            switch ((LAStatus)(int)error.Code)
            {
            case LAStatus.AuthenticationFailed:
                var description = error.Description;
                if (description != null && description.Contains("retry limit exceeded"))
                {
                    result.Status = FingerprintAuthenticationResultStatus.TooManyAttempts;
                }
                else
                {
                    result.Status = FingerprintAuthenticationResultStatus.Failed;
                }
                break;

            case LAStatus.UserCancel:
            case LAStatus.AppCancel:
                result.Status = FingerprintAuthenticationResultStatus.Canceled;
                break;

            case LAStatus.UserFallback:
                result.Status = FingerprintAuthenticationResultStatus.FallbackRequested;
                break;

            case LAStatus.TouchIDLockout:
                result.Status = FingerprintAuthenticationResultStatus.TooManyAttempts;
                break;

            default:
                result.Status = FingerprintAuthenticationResultStatus.UnknownError;
                break;
            }

            result.ErrorMessage = error.LocalizedDescription;

            return(result);
        }
示例#30
0
        public async void fingerAuth(bool first = false)
        {
            bool isFingerprintAvailable = await CrossFingerprint.Current.IsAvailableAsync(false);

            //Проверяем наличие датчика отпечатков и наличие загрузки приложение
            //Если первый раз запустили, то нет смысла выводить данное сообщение
            if (!isFingerprintAvailable && !first)
            {
                await DisplayAlert("Ошибка",
                                   "Вход по отпечатку пальца недоступен", "OK");

                return;
            }

            AuthenticationRequestConfiguration conf =
                new AuthenticationRequestConfiguration("Аутентификация",
                                                       "Авторизируйтесь");

            //Проверяем прошла ли авторизация по отпечатку
            FingerprintAuthenticationResult authResult = await CrossFingerprint.Current.AuthenticateAsync(conf);

            if (authResult.Authenticated)
            {
                try
                {
                    try
                    {
                        await PopupNavigation.Instance.PushAsync(new StatusBar());
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(ex.ToString());
                    }
                    Request request = new Request();
                    //Проверяем  авторизацию по логину и паролю, если все ок, то выводим задачи пользователю, если нет, то выводим ошибку
                    if (request.authorization(CrossSettings.Current.GetValueOrDefault("login", login.Text.Trim(' ')), CrossSettings.Current.GetValueOrDefault("password", password.Text)))
                    {
                        errorMessage.IsVisible  = false;
                        errorMessage1.IsVisible = false;

                        Analytics.TrackEvent("Выполнен вход в систему: пользователь - " + CrossSettings.Current.GetValueOrDefault("login", string.Empty) + ", " + DateTime.Now);

                        //Инициализируем данные о авторизации при подключении для получения изображений в FFImageLoading
                        //ImageService.Instance.Config.HttpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic",
                        //Convert.ToBase64String(System.Text.ASCIIEncoding.ASCII.GetBytes($"{CrossSettings.Current.GetValueOrDefault("login", login.Text)}:{CrossSettings.Current.GetValueOrDefault("password", password.Text)}")));

                        // если дата емпти, запрускает главный экран приложения
                        if (data == "empty")
                        {
                            await Navigation.PushModalAsync(new AllIssues()).ConfigureAwait(true);
                        }
                        else
                        {
                            //регулярные выражения обрабатывают полученые ссылки
                            // и если ссылка соответсвует одному из регклярных выражений, то вызывается страница
                            // соответсвующая тому или инному регулярному выражению
                            // если ссылка не соответствует ни одному регулярному выражению, то открывается глаынй экран приложенгия


                            Regex regex  = new Regex(@"(objectId=(\w{2,100}$)|(id=(.{2,1000}$)))");
                            Match match2 = regex.Match(data);
                            if (match2.Success)
                            {
                                string      input       = Regex.Replace(match2.Value, @"(^\w{2,100}=)", "");
                                JSONRequest jsonRequest = new JSONRequest()
                                {
                                    urlRequest    = $"/rest/insight/1.0/object/{input}",
                                    methodRequest = "GET"
                                };
                                request = new Request(jsonRequest);

                                ObjectEntry insightObject = request.GetResponses <ObjectEntry>();
                                await Navigation.PushModalAsync(new NavigationPage (new TabPageObjectInsight(insightObject))).ConfigureAwait(true);
                            }

                            if (!match2.Success)
                            {
                                regex = new Regex(@"(\w{2,10}-+\d{2,100}$)");
                                Match match1 = regex.Match(data);
                                if (match1.Success)
                                {
                                    Issue issue = new Issue()
                                    {
                                        key = match1.Value
                                    };
                                    await Navigation.PushModalAsync(new NavigationPage(new TabPageIssue(issue))).ConfigureAwait(true);
                                }
                                if (!match1.Success && !match2.Success)
                                {
                                    await Navigation.PushModalAsync(new AllIssues()).ConfigureAwait(true);
                                }
                            }
                        }


                        try
                        {
                            await PopupNavigation.Instance.PopAsync(true);
                        }
                        catch (Exception ex)
                        {
                            Console.WriteLine(ex.ToString());
                        }
                    }
                    else
                    {
                        errorMessage.IsVisible  = true;
                        errorMessage1.IsVisible = true;
                        errorMessage.Text       = "Ошибка входа! Ведите логин и пароль";
                        try
                        {
                            await PopupNavigation.Instance.PopAsync(true);
                        }
                        catch (Exception ex)
                        {
                            Console.WriteLine(ex.ToString());
                        }
                    }
                }
                catch (Exception ex)
                {
                    Crashes.TrackError(ex);
                    Console.WriteLine(ex.ToString());
                }
            }
        }