来自LDAP与LDAPS

时间:2015-10-23 17:56:08

标签: c# active-directory principalcontext

我有一些使用System.DirectoryServices.AccountManagement的C#代码,用于允许用户更改其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)。但是,如果我为LDAPS指定ContextOptions.Signing,则DC拒绝响应。

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

1 个答案:

答案 0 :(得分:1)

Based on this article, it seems that's just the best you will get with LDAPS: https://blogs.msdn.microsoft.com/dsadsi/2012/06/06/changepassword-and-password-complexity-violation-error-codes/

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

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

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

虽然您之前无法验证新密码是否曾被使用过。