C# 如何使用.NET或LDAP验证过期的Active Directory密码 基本问题

C# 如何使用.NET或LDAP验证过期的Active Directory密码 基本问题,c#,.net,vb.net,authentication,active-directory,C#,.net,Vb.net,Authentication,Active Directory,如果Active Directory密码已过期,是否有方法使用.NET或其他类型的LDAP查询验证该密码?要明确的是,我不是说检查密码是否过期,我是说验证过期密码是否正确 我发现这解释了如何使用Win32 API的LogonUser()函数来实现。我已经问过了。在这里,我要问的是,除了Win32 API,最好是.NET,是否可以通过任何其他方式完成 进一步审议本专题 无论密码是否错误、过期或下次登录时需要更改,PrincipalContext.ValidateCredentials方法和Dire

如果Active Directory密码已过期,是否有方法使用.NET或其他类型的LDAP查询验证该密码?要明确的是,我不是说检查密码是否过期,我是说验证过期密码是否正确

我发现这解释了如何使用Win32 API的LogonUser()函数来实现。我已经问过了。在这里,我要问的是,除了Win32 API,最好是.NET,是否可以通过任何其他方式完成

进一步审议本专题 无论密码是否错误、过期或下次登录时需要更改,PrincipalContext.ValidateCredentials方法和DirectoryEntry构造函数都会返回相同的登录失败消息。无法区分错误的密码和正确但已过期的密码

Active Directory不公开密码散列,而且AFAIK没有办法解决这个问题(这可能是一件好事…),因此尝试使脚本散列密码并将其与目录进行比较是一条死胡同

我使用.NET(或Win32 API以外的任何东西)所能想到的最好的解决方案是这样一种笨拙的变通方法:

  • 检查密码是否过期(通过检查pwdLastSet日期与当前日期之间的差异是否大于最大密码期限)
  • 如果过期,检查是否锁定。如果是,请解锁它
  • 读取badPwdCount属性
  • 如果失败,尝试通过任何增加badPwdCount的方式进行身份验证(ValidateCredentialsDirectoryEntryrunas命令,以及许多其他方式)。验证是否引发登录错误
  • 再次阅读badPwdCount。如果密码增加,则说明提供的密码不正确。如果没有增加,则说明密码不正确
  • (步骤2是必要的,因为如果帐户被锁定,失败的身份验证尝试不会增加badPwdCount。)

    然而,我认为该计划有几个弱点:

    • 如果在badLogonCount的“之前”和“之后”读数之间发生来自另一个源的身份验证尝试,或者管理员重置了badLogonCount或锁定持续时间到期,则会产生错误结果
    • 脚本必须确保始终使用相同的域控制器,以避免由于收敛延迟而产生错误结果
    • 在某些情况下,脚本必须进行更改(解锁帐户),否则它将无法工作。理想情况下,验证操作不应该改变它检查的数据的任何方面
    虽然很少遇到这些问题,我也能想出一些方法来缓解它们,但这些方法相当混乱,而且不是100%可靠,总体而言,这远不是一个理想的解决方案

    是否有任何直接的方法可以通过.NET或任何类型的LDAP查询来检查此问题?是否有某种身份验证方法可以产生错误结果,区分无效凭据和过期密码的有效凭据,就像LogonUser()所做的那样,或者其他一些创造性的方法来区分那些不受上述想法陷阱影响的东西

    类似的问题,但没有答案 这个话题以前已经被提出过多次,但这个具体问题没有答案

    这两个答案都特定于在设置“用户下次登录时必须更改密码”标志时验证凭据。粗略地看一下,第二个答案似乎是针对密码过期的情况,因为其中一个代码分支抛出了“1907密码过期”异常,但如果仔细阅读代码,您会发现此错误消息具有误导性;只有在设置了“用户下次登录时必须更改密码”标志且凭据正确的情况下才会抛出此选项

    这两个问题的答案都有链接,指向建议使用LogonUser()的答案


    [注:我添加了
    c#
    vb.net
    标记,因为尽管问题与语言无关,但我相信这些标记最有可能引起熟悉该主题的人的注意;其他标记本身的可见性似乎很低,在前5个小时只有7个视图卢比]

    p/Invoke示例出了什么问题?除此之外,我还不知道有什么管理方法可以做到这一点。好吧,你可以在我一小时前发布的一个喜欢的问题中看到,我在PowerShell中使用它时遇到了困难。我已经绕过了这个问题,但在某种程度上对我来说没有什么意义,这突出了它是一个多么混乱的问题解决方案是这样的。考虑到AD确实提供了识别身份验证失败具体原因的错误,只有Win32 API向用户报告,而其他身份验证方法只是报告成功或失败,这似乎很奇怪。我想这是一种“哦,来吧,一定有更好的方法…”