Active directory DirectoryServices.AccountManagement“;旧的;更改密码后,密码仍然有效

Active directory DirectoryServices.AccountManagement“;旧的;更改密码后,密码仍然有效,active-directory,directoryservices,account-management,Active Directory,Directoryservices,Account Management,在Active Directory中重置用户密码后,如果用户尝试使用其旧密码登录,以下代码将验证为真: Dim up As UserPrincipal = GetAdUser(objContext, arg_strBA, arg_strUsername) If up IsNot Nothing Then Dim valid As Boolean = up.Context.ValidateCredentials( up.UserPrincipalName, arg_strPas

在Active Directory中重置用户密码后,如果用户尝试使用其旧密码登录,以下代码将验证为真:

Dim up As UserPrincipal = GetAdUser(objContext, arg_strBA, arg_strUsername)

If up IsNot Nothing Then

    Dim valid As Boolean = up.Context.ValidateCredentials(
    up.UserPrincipalName, arg_strPassword, ContextOptions.Negotiate)


    If (valid) Then strReturn = up.SamAccountName

End If
我们正在使用以下代码重置密码:

Dim objUser As New DirectoryEntry(arg_strLDAPPath)

If Not objUser Is Nothing Then
    objUser.AuthenticationType = AuthenticationTypes.Secure


    objUser.Invoke("SetPassword", arg_strNewPW)
    objUser.CommitChanges()
end if
密码重置工作正常,用户可以使用新密码登录,但旧密码不应仍然有效

当上述ValidateCredentials适用于旧密码时,我们将凭据分配给web服务调用,然后调用失败并出现“401:Unauthorized”错误


有人看到过这样的情况吗?

你有没有考虑到广告在网络上传播这样的变化需要15分钟的时间


Marc

我假设您正在验证在客户端计算机上执行的基本属性。如果是这种情况,则缓存旧的(成功的)密码。这样做是为了在Active Directory脱机或无法访问时允许用户登录。传播更改需要一些时间

如果你想绕过这个问题,你应该在身份验证时向服务于Web服务的服务器而不是本地客户机进行身份验证。

我找到了答案

从链接


但是,重要的是ContextOption不能确保只使用Kerberos。事实证明,在某些情况下(例如,如果您指定的是AD而不是本地,并且您有一个足够最新的服务器),代码选择无论如何进行协商。从这个意义上说,指定密封可能意味着它将使用Kerberos,但不一定是独占的。真正重要的标志是在该标志下隐藏了几层。在封面下,此方法最终建立了LdapConnection,设置了连接的网络凭据,设置AuthType(重要的实际标志!),最后调用Bind()方法。LdapConnection.Bind()方法使用指定的凭据建立到其中一个AD服务器的经过身份验证的连接。问题是当PrincipalContext.ValidateCredentials设置此调用时(在您的场景中),它总是设置AuthType=Negotiate。在这种情况下,Kerberos实际上会被使用,并最终失败,但系统会退回到NTLM。”

这是可行的-请参阅下面的解决方案-如果您觉得这有帮助,请告诉我,因为我们的商店对这是否是一个可行的解决方案存在分歧

以下是Active Directory的解决方案,允许旧密码在更改后工作。我非常希望收到关于接受此解决方案的反馈,因为它在登录身份验证期间使用ChangePassword。这是一件奇怪的事情,但它是有效的。目前,我们的商店没有使用此解决方案,因此如果有人能告诉我他们是否正在使用此解决方案,我们将不胜感激

多谢各位 Ch

Active Directory和旧密码返回有效(15分钟到+-小时)。调用SetPassword或ChangePassword时会发生这种情况

历史:

我发现这被称为AD的一个“功能”,并且是设计内置在AD中的,因此当用户更改密码时,有一种宽限期,允许使用这些密码的所有资源转移到新密码

AD支持AD知道最新密码这一概念的一个例子是更改PC上的登录密码–在这种情况下,计算机将不允许旧密码登录。虽然我没有这个答案(除了微软必须让它工作),但我认为这并不像它看起来那么简单,因为它涉及到电脑,而且上面也有密码

显示AD do中密码更改如何持续一段时间的一个示例可能是:

从Windows 7 PC到Windows Server 2008 R2机箱使用远程桌面。从Windows安全框登录,然后出现“单击确定”框,单击确定,您即已登录。现在,将用于远程登录的用户的密码更改到框中(与Kirkman用户不同??),注销并使用旧密码再次登录(时间范围为15分钟到1小时+-)。旧密码将使您通过Windows安全框并进入“确定”框。单击“确定”后,它将失败。如果您从远程桌面重新启动,并尝试使用错误的密码,您将在Windows安全框中停止,并显示消息“登录尝试失败”。时间限制到期后,您将无法使用旧密码通过Windows安全框。(确保每次都从远程桌面启动,而不是切换用户,这将按预期操作,这也表明电脑以某种方式参与其中)。至少它不允许用户登录——但这确实表明(似乎是广告)在某种程度上允许旧密码在某种程度上进行身份验证

研究: 我已经找到了很多关于这个问题的参考文献,只有一个潜在的解决方案,到目前为止,我还无法确定我们是否能够实现它(这是指严格通过Kerberos调用,而不是NTLM调用,根据文档和我的研究,NTLM不像看起来那么简单)。我在.NET中找到了许多如何与广告互动的链接,但没有实际的广告手册

解决方案-如果您想要解决方案,请阅读本部分!!! 出席: 我发现(在测试期间意外地)对AD的ChangePassword调用将不允许传递给它的旧密码成功地将密码更改为新密码。这是我的意见,这项测试的工作,实际上并不知道,因为我没有发现任何参考它正在使用。其实我还没有找到解决这个问题的办法。一天凌晨3:00,我意识到我可以利用ChangePassword的使用来提供这个问题的解决方案——至少在我们确定更好的方法之前,我们可以立即使用解决方案

首先,我检查所有内容是否有效,是否有广告