复位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:未经授权”。误差

任何人都见过这样的事?

有帮助吗?

解决方案 3

我发现那位答案这里

从链接...

“不过,真正重要的是,ContextOption做的的保证只使用Kerberos的的。事实证明,在某些情况下(例如,如果您指定广告,而不是局部的,和你有一个足够最新的服务器),代码选择做协商不管是什么。在这个意义上,指定密封可能意味着它将使用Kerberos,但不一定完全,真正重要的标志,根据该安葬好几层。在幕后这种方法最终建立LdapConnection,设置连接网络的凭据,即设置进行AuthType(该事项实际的标志!),最后调用bind()方法。该LdapConnection.Bind()方法建立了一个认证的连接使用指定的证书的AD服务器之一。问题是,当PrincipalContext.ValidateCredentials建立此呼叫(在方案中),它总是设置进行AuthType =协商。在这种情况下,确实的Kerberos在事实上得到使用,并且最终失败,但是系统回退到NTLM。“

其他提示

此问题是不相关的代码,但罪魁祸首上听到的是活动目录中...

请参阅 http://support.microsoft.com/kb/906305 获得溶液。 ..

本作品 - 请参见下面的解决方案 - 请让你有所帮助作为我们的店是这是否是一个不错的解决方案分为我知道

下面是一个解决方案到Active Directory允许旧密码被更改后,开始工作。我非常想上接受这一解决方案的反馈,因为它的登录认证过程中使用的ChangePassword。这是做一个奇怪的事情,但它的工作原理。目前,我们的店是不使用这一解决方案,因此,如果任何人都可以,如果他们正在使用它,或者告诉我不是,将不胜感激。

感谢您 CH

Active Directory和旧密码返回有效(15分钟至+ - 小时)。当SetPassword或ChangePassword被调用时发生。

历史:

我发现,这就是所谓的AD的“功能”,并且是通过内置于AD设计,使得当用户改变密码有一种宽限期,允许使用的那些密码的所有资源转移到新的一个。

这支持AD知道最新的密码概念AD的一个例子是可在PC上改变登录口令的 - 在这种情况下,计算机将不允许旧密码来登录。虽然我没有这个问题的答案(Microsoft以外的其他必须得到这个工作),它是我的看法,这不是简单,因为它可能显示为PC参与,并在有密码了。

一个例子示出了AD密码如何变化的时间段做最后可以是:

从Windows 7 PC到Windows Server 2008 R2箱使用远程桌面。从Windows安全箱登录然后,单击OK出现框中,单击确定,您在登录了。现在你用远程与(从柯克曼用户??不同),注销和登录框的用户更改密码再次用旧密码(时间内15分钟到1小时+ - )。旧的密码将让你过去的Windows安全对话框并确定盒。当您单击确定它就会失败。如果从远程桌面重新开始,并尝试你会在Windows安全盒停止与消息的密码错误“的登录尝试失败”。期限届满后,你不会得到过去的旧密码的Windows安全框。 (请确保将远程桌面开始每次不转预期这也表明,在所涉及的PC不知何故,这是后续用户)。至少它没有用户登录 - 但这的确表明,在一定程度上(这似乎是AD)允许旧密码验证到某种程度的

研究: 我发现这个问题,并多次提到只有一个可能的解决方案,这一点我一直没能确定,如果我们可以实现它(这是引用通过Kerberos而不是NTLM这是不是因为它可以作为简单的严格调用根据文档和我的研究)出现。我发现有很多链接如何与AD在.NET中,但没有实际的广告手册互动。

解决方案解决方案解决方法 - 如果你想要的解决方案解决方案阅读这一部分! 当下: 我发现(通过在测试过程中意外)的ChangePassword调用AD将不允许OldPassword更改传递给它在改变密码,新密码成功。在我看来,本次测试,做工作,因为我还没有找到使用它的任何引用实际上并没有知道。其实,我还没有发现任何解决这个问题。一天早晨,上午3:00,我意识到,我可以利用这个使用ChangePassword的提供了解决这个问题 - 至少我们的解决可以立即使用,直到我们能够确定一个更好的办法

首先,我检查一切是有效的和AD返回该密码是有效的。然后ChangePassword一个呼叫(用户名,旧密码,新密码)与旧密码和新密码作为密码由用户提供(两者相同)就完成了。我知道两(可能是三个,但PAS之一剑政策违反得手)的结果会发生停止。无论是OldPassword更改是好的,我们会失败,因为密码策略不满足(历史,新密码不能是最后N个密码中的一个),否则我们会失败,因为旧密码不正确(包括返回的异常错误在消息文本)。我们检查这最后一个条件,如果旧密码是无效的,我们不要让用户身份登录。

未来: 也许第二组的眼睛会有所帮助。点击 我认为解决的办法是在模拟或Kerberos。我还没有在任何的这些找出足够的解决方案的成功。很明显,广告就可以旧口令之间因为ChangePassword做它区分。我们正在做的是在安全的心脏所以不是一切都是开放的(就像看到AD密码历史记录的功能,我还没有找到一种方法来访问它)。

你接受了长达15分钟的时间考虑在内的是指令要求传播等,在整个网络的变化?

马克

我假设你ValidateCredentials在客户机上执行。如果是这样的话,那么它有旧的(成功的)密码缓存。这样做是为了使用户能够登录如果Active Directory脱机或无法访问。传播的变化需要花费一些时间。

如果你想解决这个问题,你应该在服务认证时间,而不是本地客户机上的web服务的服务器进行身份验证。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top