如何基于pGina开源项目在Windows winlogon登录界面新增并处理OTP字段
pGina新增OTP登录字段实现方案
一、UI字段添加步骤
pGina的登录界面UI逻辑都在pGina.CredentialProvider项目下处理,无需改动Windows原生winlogon底层逻辑,直接修改pGina自定义UI渲染逻辑即可:
- 找到
pGina.CredentialProvider\UI\CredentialDialog.xaml,新增TextBlock和输入框组合控件(OTP支持明文/密文输入,可按需选择TextBox或PasswordBox),x:Name设为otpTextBox,控件顺序放在密码输入框下方即可 - 打开对应后台文件
CredentialDialog.xaml.cs,在GetUserData()方法中新增OTP字段取值逻辑,把otpTextBox.Text的值存入返回的用户数据字典中,Key可设为"OTP" - 修改
pGina.Shared.Types.UserInformation类,新增public string Otp { get; set; }属性,用来传递三类输入字段的值到认证逻辑层
二、认证逻辑对接
调整pGina的认证pipeline处理OTP校验即可:
- 找到
pGina.Core\Authentication\AuthenticationChain.cs,在用户名密码校验通过的逻辑节点之后,新增OTP校验步骤 - 本地校验场景直接在新增步骤中读取
UserInformation类的Otp属性完成校验;对接远端OTP服务场景可在该节点添加服务请求逻辑 - 校验失败时直接返回认证失败标识,pGina会自动在登录界面弹出错误提示,无需额外处理UI反馈
三、兼容原生登录逻辑注意事项
- 不要修改pGina对原有winlogon回调的处理逻辑,仅在自定义UI和认证链部分做改动,避免出现登录卡死、系统无法进入的问题
- 测试阶段建议开启系统远程桌面功能,万一修改后本地登录失败可以通过远程桌面改回原有配置或者卸载pGina
- 打包安装包时记得把新增的xaml资源包含到项目的安装脚本里,避免部署后OTP字段不显示
- 如果需要兼容域登录场景,在认证链处理时要先完成域的用户名密码校验,再执行OTP校验,不要改动原有域认证的逻辑
内容的提问来源于stack exchange,提问作者user1419021
相关产品推荐
相关产品推荐

