如何让LogonUser不使用缓存凭据?

时间:2012-04-30 14:37:06

标签: security winapi active-directory authentication

我正在使用LogonUser来验证用户的域凭据集。

LogonUser(accountName, domain, password, 
      LOGON32_LOGON_NETWORK, LOGON32_PROVIDER_WINNT50, ref token);

令人不安的结果:

 LogonType    Current Password                Old password
 ===========  ==============================  ========================
 Network      Succeeds                        Succeeds
 Batch        Fails (0x00000569)              Fails (invalid password)
 Interactive  Succeeds                        Fails (invalid password)

失败代码:

  • 0x00000569登录失败:未在此计算机上授予用户请求的登录类型
  • 0x0000052E登录失败:用户名或密码未知

详细说明:

  • 如果用户输入有效凭据,则该函数返回true(好)
  • 如果用户输入无效凭据,则该函数返回false(好)

  • 如果用户更改了密码,并输入新的有效凭据,则该函数会返回true(好)

  • 如果用户输入无效凭据,则该函数返回false(好)

  • 如果用户输入凭据,则该函数会返回 true 。的 (坏)

  

注意:如果用户移动到其他计算机(之前从未登录过的计算机),并输入凭据,则LogonUser继续返回 true 。这意味着缓存不会发生在本地计算机上 - 但不知何故“在网络上”。

  • 如果用户再次更改密码 ,并输入新凭据,该函数将返回true(好)
  • 如果用户输入凭据,则该函数会返回 true (坏)
  • 如果用户输入 凭据,则该函数返回false(好)

如何在致电LogonUser时指示其指示域不使用缓存凭据

  

注意:如果用户尝试使用旧的(或旧)密码登录Windows,则会收到无效的密码错误。


  

来自MSDN:

     

LOGON32_LOGON_NETWORK
  此登录类型适用于高性能服务器以验证明文密码。此登录类型的LogonUser函数不会缓存凭据

     

LOGON32_LOGON_INTERACTIVE
  此登录类型适用于将以交互方式使用计算机的用户,例如由terminal服务器,远程shell或类似进程登录的用户。此登录类型需要额外支出缓存已断开连接的操作的登录信息;因此,不适合某些客户端/服务器应用程序,例如邮件服务器。

     

LOGON32_LOGON_BATCH   此登录类型适用于批处理服务器,其中进程可能代表用户执行而无需直接干预。此类型也适用于一次处理许多纯文本身份验证尝试的性能较高的服务器,例如邮件或Web服务器。

am 验证纯文本密码,因此使用LOGON32_LOGON_NETWORK交互式登录缓存凭据,此处不允许这样做。 批量,虽然没有记录应该何时使用,但却失败了。


更新:域名仅允许:

  • 以前的密码(不再回头)
  • 仅60分钟

我很清楚,它是Active Directory的“功能”,可以提供1小时的宽限期。

除了我不想要宽限期,我不想更改域上的任何设置(因为我不知道域上的任何设置会允许你使用一小时的宽限期旧密码)。

1 个答案:

答案 0 :(得分:4)

这是NTLM的一个特色。您可以更改默认的60分钟。通过在域控制器上向OldPasswordAllowedPeriod密钥添加HKLM\SYSTEM\CurrentControlSet\Control\Lsa DWORD值(以分钟为单位),或者您可以禁用“强制密码历史记录”策略。您也可以尝试使用其他登录提供程序,例如LOGON32_PROVIDER_WINNT50

顺便说一句,如果您已经提供了GUI,我认为使用LOGON32_LOGON_INTERACTIVE没有任何不利之处。