コード例 #1
0
        public async Task<FingerprintAuthenticationResult> AuthenticateAsync(AuthenticationRequestConfiguration authRequestConfig, CancellationToken cancellationToken = new CancellationToken())
        {
            if(!await IsAvailableAsync())
                return new FingerprintAuthenticationResult { Status = FingerprintAuthenticationResultStatus.NotAvailable };

            return await NativeAuthenticateAsync(authRequestConfig, cancellationToken);
        }
コード例 #2
0
 protected override Task<FingerprintAuthenticationResult> NativeAuthenticateAsync(AuthenticationRequestConfiguration authRequestConfig, CancellationToken cancellationToken = new CancellationToken())
 {
     return Task.FromResult(new FingerprintAuthenticationResult
     {
         Status = FingerprintAuthenticationResultStatus.NotAvailable,
         ErrorMessage = "Not implemented for the current platform."
     });
 }
        protected override async Task<FingerprintAuthenticationResult> NativeAuthenticateAsync(AuthenticationRequestConfiguration authRequestConfig, CancellationToken cancellationToken = default(CancellationToken))
        {
            if (authRequestConfig.UseDialog)
            {
                var fragment = CrossFingerprint.CreateDialogFragment();
                return await fragment.ShowAsync(authRequestConfig, this, cancellationToken);
            }

            return await AuthenticateNoDialogAsync(new DeafAuthenticationFailedListener(), cancellationToken);
        }
コード例 #4
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))
            {
                resTuple = await _context.EvaluatePolicyAsync(LAPolicy.DeviceOwnerAuthenticationWithBiometrics, 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;
        }
コード例 #5
0
        private async void OnAuthenticateLocalized(object sender, EventArgs e)
        {
            _cancel = swAutoCancel.IsToggled ? new CancellationTokenSource(TimeSpan.FromSeconds(10)) : new CancellationTokenSource();
            lblStatus.Text = "";

            var dialogConfig = new AuthenticationRequestConfiguration("Beweise, dass du Finger hast!")
            {
                CancelTitle = "Abbrechen",
                FallbackTitle = "Anders!"
            };

            var result = await Plugin.Fingerprint.CrossFingerprint.Current.AuthenticateAsync(dialogConfig, _cancel.Token);

            await SetResultAsync(result);
        }
コード例 #6
0
        private void SetupContextProperties(AuthenticationRequestConfiguration authRequestConfig)
        {
            if (_context.RespondsToSelector(new Selector("localizedFallbackTitle")))
            {
                _context.LocalizedFallbackTitle = authRequestConfig.FallbackTitle;
            }

            if (_context.RespondsToSelector(new Selector("localizedCancelTitle")))
            {
                _context.LocalizedCancelTitle = authRequestConfig.CancelTitle;
            }
        }
コード例 #7
0
 protected abstract Task<FingerprintAuthenticationResult> NativeAuthenticateAsync(AuthenticationRequestConfiguration authRequestConfig, CancellationToken cancellationToken);
コード例 #8
0
        public override async Task <SecureFingerprintAuthenticationResult> NativeSecureAuthenticateAsync(AuthenticationRequestConfiguration authRequestConfig, string key, CancellationToken cancellationToken)
        {
            if (authRequestConfig.UseDialog)
            {
                var fragment = CrossFingerprint.CreateDialogFragment();
                return(await fragment.ShowSecureAsync(authRequestConfig, key, this, cancellationToken));
            }

            return(await AuthenticateSecureNoDialogAsync(new DeafAuthenticationFailedListener(), key, cancellationToken));
        }
コード例 #9
0
        protected override async Task <FingerprintAuthenticationResult> NativeAuthenticateAsync(AuthenticationRequestConfiguration authRequestConfig, CancellationToken cancellationToken = default(CancellationToken))
        {
            if (authRequestConfig.UseDialog)
            {
                var fragment = CrossFingerprint.CreateDialogFragment();
                return(await fragment.ShowAsync(authRequestConfig, this, cancellationToken));
            }

            return(await AuthenticateNoDialogAsync(new DeafAuthenticationFailedListener(), cancellationToken));
        }
コード例 #10
0
        protected override async Task <FingerprintAuthenticationResult> NativeAuthenticateAsync(AuthenticationRequestConfiguration authRequestConfig, CancellationToken cancellationToken = new CancellationToken())
        {
            var result = new FingerprintAuthenticationResult();

            try
            {
                var verificationResult = await UserConsentVerifier.RequestVerificationAsync(authRequestConfig.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.TooManyAttempts;
                    break;

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

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

            return(result);
        }
コード例 #11
0
        public async Task<FingerprintAuthenticationResult> ShowAsync(AuthenticationRequestConfiguration config, IAndroidFingerprintImplementation implementation, CancellationToken cancellationToken)
        {
            Configuration = config;
            _implementation = implementation;

            var currentActivity = CrossFingerprint.CurrentActivity;
            Show(currentActivity.FragmentManager, "fingerprint-fragment");

            using (cancellationToken.Register(OnExternalCancel))
            {
                return await _resultTaskCompletionSource.Task;
            }
        }
コード例 #12
0
        protected override async Task <FingerprintAuthenticationResult> NativeAuthenticateAsync(AuthenticationRequestConfiguration authRequestConfig, CancellationToken cancellationToken = default)
        {
            if (string.IsNullOrWhiteSpace(authRequestConfig.Title))
            {
                throw new ArgumentException("Title must not be null or empty on Android.", nameof(authRequestConfig.Title));
            }

            if (!(CrossFingerprint.CurrentActivity is FragmentActivity))
            {
                throw new InvalidOperationException($"Expected current activity to be '{typeof(FragmentActivity).FullName}' but was '{CrossFingerprint.CurrentActivity?.GetType().FullName}'. " +
                                                    "You need to use AndroidX. Have you installed Xamarin.AndroidX.Migration in your Android App project!?");
            }

            try
            {
                var cancel = string.IsNullOrWhiteSpace(authRequestConfig.CancelTitle) ?
                             Application.Context.GetString(Android.Resource.String.Cancel) :
                             authRequestConfig.CancelTitle;

                var handler = new AuthenticationHandler();
                var builder = new BiometricPrompt.PromptInfo.Builder()
                              .SetTitle(authRequestConfig.Title)
                              .SetConfirmationRequired(authRequestConfig.ConfirmationRequired)
                              .SetDescription(authRequestConfig.Reason);

                if (authRequestConfig.AllowAlternativeAuthentication)
                {
                    // It's not allowed to allow alternative auth & set the negative button
                    builder = builder.SetDeviceCredentialAllowed(authRequestConfig.AllowAlternativeAuthentication);
                }
                else
                {
                    builder = builder.SetNegativeButtonText(cancel);
                }
                var info     = builder.Build();
                var executor = Executors.NewSingleThreadExecutor();

                using var dialog = new BiometricPrompt((FragmentActivity)CrossFingerprint.CurrentActivity, executor, handler);
                await using (cancellationToken.Register(() => dialog.CancelAuthentication()))
                {
                    dialog.Authenticate(info);
                    return(await handler.GetTask());
                }
            }
            catch (Exception e)
            {
                return(new FingerprintAuthenticationResult
                {
                    Status = FingerprintAuthenticationResultStatus.UnknownError,
                    ErrorMessage = e.Message
                });
            }
        }
コード例 #13
0
 protected override Task <FingerprintAuthenticationResult> NativeAuthenticateAsync(AuthenticationRequestConfiguration authRequestConfig, CancellationToken cancellationToken = new CancellationToken())
 {
     return(Task.FromResult(new FingerprintAuthenticationResult
     {
         Status = FingerprintAuthenticationResultStatus.NotAvailable,
         ErrorMessage = "Not implemented for the current platform."
     }));
 }
コード例 #14
0
        protected override async Task <FingerprintAuthenticationResult> NativeAuthenticateAsync(AuthenticationRequestConfiguration authRequestConfig, CancellationToken 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);
        }