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); }
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); }
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; }
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); }
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; } }
protected abstract Task<FingerprintAuthenticationResult> NativeAuthenticateAsync(AuthenticationRequestConfiguration authRequestConfig, CancellationToken cancellationToken);
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)); }
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)); }
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); }
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; } }
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 }); } }
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) { 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); }