0

我有一些 C# 代码System.DirectoryServices.AccountManagement用于允许用户更改其 Active Directory 用户帐户密码。它目前正在使用 LDAP (:389),出于安全目的,我想将其切换到 LDAPS (:636)。但是,当我切换到 LDAPS 时,返回给我的错误消息会发生变化并且变得不那么有用。

简而言之,这是问题:

如果我使用 LDAP (:389) 连接,我使用以下 ConextOptions

ContextOptions.Negotiate | ContextOptions.ServerBind | ContextOptions.Signing

如果我使用 LDAPS (:636) 连接,我使用以下 ContextOptions

ContextOptions.Negotiate | ContextOptions.ServerBind | ContextOptions.SecureSocketLayer

如果用户提供正确的当前密码和有效的新密码,则任一版本都可以更改密码。但是,例如,在用户输入了错误的当前密码的情况下,我收到的错误消息是不同的,并且在 LDAPS 的情况下不太有用:

LDAP(:389):

指定的网络密码不正确。(来自 HRESULT 的异常:0x80070056)

LDAPS(:636):

发生约束冲突。(来自 HRESULT 的异常:0x8007202F)

差异的关键似乎是ContextOptions.Signing- 如果我没有指定 LDAP(:389) 连接,我会收到与 LDAPS(:636) 相同的错误消息。但是,如果我ContextOptions.Signing为 LDAPS 指定 DC 拒绝响应。

  • ContextOptions.Signing使用 LDAPS 时有什么方法可以使用吗?
  • 有没有其他方法可以在不使用的情况下获得更有意义的错误消息ContextOptions.Signing
  • ContextOptions.Sealing说它使用 Kerberos 加密数据 - 我可以在 :389 上使用此选项来获得与使用 LDAPS 相同级别的安全性吗?文档的细节很少
4

1 回答 1

1

根据这篇文章,这似乎是您使用 LDAPS 可以获得的最佳效果:https ://blogs.msdn.microsoft.com/dsadsi/2012/06/06/changepassword-and-password-complexity-violation-error-codes /

要解决此问题,您可以在实际执行密码更改之前进行一些验证,例如:

  • 使用给定的当前密码验证帐户是否正确
  • 查找密码策略以验证:
    • 新密码复杂度
    • 现有密码的最小年龄(检查密码上次更改属性)

这很痛苦,但是如果您事先进行所有这些检查,您可以为您的用户提供更多描述性的错误消息。

尽管您将无法验证新密码之前是否未被使用过。

于 2016-03-05T22:55:01.390 回答