You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

UWP集成Windows Hello指纹认证最大尝试次数及超限处理方法

UWP 自定义Windows Hello指纹认证最大尝试次数实现方案

注意:Windows Hello 系统级生物识别尝试次数由系统安全策略管控,UWP应用无权限修改系统层面的阈值,所有自定义次数限制逻辑均需在应用层实现。


核心实现步骤

1. 定义计数变量与阈值配置

在认证页面的类中定义全局字段,阈值可抽成可配置项方便后续调整,计数建议做持久化避免页面导航、应用挂起后数据丢失:

// 最大允许指纹验证失败次数,可根据需求修改或绑定到用户设置项
private const int MaxAllowedFailedAttempts = 3;
// 当前连续失败次数
private int _currentFailedCount = 0;

2. 监听认证返回结果,维护失败计数

调用Windows Hello认证接口UserConsentVerifier.RequestVerificationAsync后,根据返回的UserConsentVerificationResult枚举值处理对应逻辑,仅在非用户主动取消的验证失败场景累加计数:

public async Task StartFingerprintAuth()
{
    var authResult = await UserConsentVerifier.RequestVerificationAsync("请验证指纹登录应用");
    switch (authResult)
    {
        // 验证通过
        case UserConsentVerificationResult.Verified:
            _currentFailedCount = 0;
            // 持久化重置后的计数
            ApplicationData.Current.LocalSettings.Values["FingerprintFailedCount"] = 0;
            Frame.Navigate(typeof(AppMainPage));
            break;
        // 系统层面识别次数耗尽(通常为连续失败5次以上Windows自动锁定生物识别)
        case UserConsentVerificationResult.RetriesExhausted:
        // 设备异常、策略禁用、未配置指纹等不可用场景
        case UserConsentVerificationResult.DeviceBusy:
        case UserConsentVerificationResult.DeviceNotPresent:
        case UserConsentVerificationResult.NotConfiguredForUser:
        case UserConsentVerificationResult.DisabledByPolicy:
            await ShowThresholdTip();
            SwitchToPasswordLogin();
            break;
        // 单次验证失败(指纹不匹配)
        case UserConsentVerificationResult.Retry:
            _currentFailedCount++;
            ApplicationData.Current.LocalSettings.Values["FingerprintFailedCount"] = _currentFailedCount;
            // 达到自定义阈值
            if (_currentFailedCount >= MaxAllowedFailedAttempts)
            {
                await ShowThresholdTip();
                SwitchToPasswordLogin();
                _currentFailedCount = 0;
                ApplicationData.Current.LocalSettings.Values["FingerprintFailedCount"] = 0;
            }
            break;
        // 用户主动取消认证,不计入失败次数
        case UserConsentVerificationResult.Canceled:
            break;
    }
}

3. 实现阈值触发后的提示与跳转

编写弹窗提示和密码页切换逻辑,样式可参考设计稿调整:

// 弹出次数超限提示
private async Task ShowThresholdTip()
{
    await new ContentDialog
    {
        Title = "指纹验证失败",
        Content = $"您已连续{MaxAllowedFailedAttempts}次指纹验证失败,请改用账号密码登录。",
        CloseButtonText = "确定"
    }.ShowAsync();
}

// 切换到账号密码登录界面
private void SwitchToPasswordLogin()
{
    FingerprintAuthArea.Visibility = Visibility.Collapsed;
    PasswordLoginArea.Visibility = Visibility.Visible;
}

4. 页面加载时恢复历史计数

认证页面加载时读取本地存储的历史失败计数,避免应用重启、挂起恢复后计数重置:

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    base.OnNavigatedTo(e);
    if (ApplicationData.Current.LocalSettings.Values.TryGetValue("FingerprintFailedCount", out object savedCount))
    {
        _currentFailedCount = (int)savedCount;
    }
}

参考提示样式

指纹验证失败超限提示参考


内容的提问来源于stack exchange,提问作者Piumi ganegoda

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 23:33:29