【问题标题】:How to have LogonUser not use cached credentials?如何让 LogonUser 不使用缓存的凭据?
【发布时间】:2012-05-10 06:13:57
【问题描述】:

我正在使用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(好)
  • 如果用户输入 invalid 凭据,该函数将返回 false(好)

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

  • 如果用户输入 invalid 凭据,该函数将返回 false(好)

  • 如果用户输入他们的凭据,该函数将返回true(坏)

注意:如果用户移动到另一台机器(他们以前从未登录过的机器)并输入凭据,LogonUser 将继续返回正确。这意味着缓存没有发生在本地机器上 - 而是以某种方式“在网络上”。

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

如何在调用LogonUser 时指示它指示域不使用缓存的凭据

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


来自 MSDN:

LOGON32_LOGON_NETWORK
此登录类型旨在供高性能服务器验证明文密码。 LogonUser 函数不缓存此登录类型的凭据

LOGON32_LOGON_INTERACTIVE
此登录类型适用于将以交互方式使用计算机的用户,例如通过terminal 服务器、远程 shell 或类似进程登录的用户。这种登录类型有为断开连接的操作缓存登录信息的额外费用;因此,它不适用于某些客户端/服务器应用程序,例如邮件服务器。

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

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


更新:该域只允许:

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

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

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

【问题讨论】:

    标签: security winapi active-directory authentication


    【解决方案1】:

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

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

    【讨论】:

    • am 使用 LOGON32_PROVIDER_WINNT50 - 我不 想要 使用废弃的 NTLM。因此,隐含的问题变成了“我如何使用 Kerberos 而不是 NTLM 身份验证?”。但是“为什么LogonUser 使用NTLM 而不是Kerberos?”的问题 不是StackOverflow nor ServerFault seem to be able to answer 的问题。
    猜你喜欢
    • 2015-04-28
    • 2011-10-05
    • 1970-01-01
    • 2011-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-05
    • 2011-03-04
    相关资源
    最近更新 更多