You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Windows 10 X64域环境下自定义Windows Credential Provider无法对"Other User"磁贴中Administrator账号强制secondary authentication的问题求助

Windows 10 X64域环境下自定义Windows Credential Provider无法对"Other User"磁贴中Administrator账号强制secondary authentication的问题求助

我完全理解你现在的困扰——本来在本地环境运行好好的自定义Credential Provider,一加入域就被"Other User"磁贴钻了空子,导致Administrator账号能绕开你的2FA直接登录。你之前尝试的几个思路确实都有各自的硬伤,要么改动太大影响体验,要么没找到Windows底层机制的突破口。结合我做Windows Credential Provider开发的经验,给你几个更贴合系统机制的可行方案:

方案一:用ICredentialProviderFilter拦截默认Provider的Admin请求

Windows其实提供了专门的Credential Provider过滤机制,你可以实现ICredentialProviderFilter接口来控制哪些Provider能处理特定的登录请求:

  • 实现Filter方法时,先判断当前的登录场景(比如CPUS_LOGONCPUS_UNLOCK_WORKSTATION),再获取请求的用户名。如果检测到是Administrator账号,就返回CPF_OTHER,让系统优先调用你的自定义Provider,而非默认的PasswordProvider。
  • 要注意正确注册这个Filter:在注册表HKLM\Software\Microsoft\Windows\CurrentVersion\Authentication\Credential Provider Filters下添加你的Provider的CLSID,并且设置合适的优先级(确保比默认PasswordProvider的优先级高)。这个方法不用改动原生UI,对用户体验影响极小。

方案二:扩展自定义Provider支持"Other User"的用户名输入流程

你之前担心做自定义"Other User"磁贴会破坏体验,但其实不用完全替代原生逻辑,只要让你的Provider支持用户名输入枚举即可:

  • 在你的Provider实现ICredentialProvider::GetCredentialCount时,额外返回一个支持用户名输入的凭据项(逻辑和原生"Other User"类似)。
  • 当用户输入用户名后,你的Provider先校验是否是Administrator:如果是,直接触发你的2FA流程;如果是普通本地用户或域用户,可以调用系统原生的密码验证API(比如LogonUser)来完成认证,保持原有体验不变。
  • 这种方式能把所有登录请求(包括"Other User"里的)都纳入你的控制范围,既保留原生UI,又能确保Admin必须走2FA。

方案三:结合组策略做辅助限制

虽然没有直接禁用"Other User"里Admin登录的系统开关,但可以用组策略配合你的Provider做动态控制:

  • 可以在组策略Computer Configuration\Windows Settings\Security Settings\Local Policies\User Rights Assignment中,先给Administrator设置Deny log on locally,然后在你的Provider完成2FA校验后,通过自定义身份验证逻辑绕过这个限制,确保只有通过2FA的Admin才能登录。
  • 另外,也可以尝试组策略Computer Configuration\Administrative Templates\System\Logon\Hide entry points for fast user switching,部分Windows版本下这个设置会隐藏"Other User"磁贴,但需要测试兼容性,建议作为辅助手段配合前面的方案使用。

一些关键注意事项

  • 开发测试时一定要留一个备用的管理员账号(比如专门的测试Admin),避免你的Provider出现bug导致系统无法登录。
  • 关于登录日志,你可以在Provider的认证流程中直接调用Windows事件日志API(EventWrite)写入记录,确保所有登录尝试(包括"Other User"里的请求)都被完整记录。
  • 域环境下要注意兼容Kerberos和NTLM认证流程,处理域用户时不要破坏原生的域登录逻辑,只针对Administrator账号做2FA拦截。

内容来源于stack exchange

火山引擎 最新活动