我有一些使用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拒绝响应。
ContextOptions.Signing
吗?ContextOptions.Signing
的情况下获取更有意义的错误消息?ContextOptions.Sealing
表示它使用Kerberos加密数据 - 我可以在389上使用此选项来获得与使用LDAPS相同的安全级别吗?文档细节很少答案 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/
要解决此问题,您可以在实际执行密码更改之前进行一些验证,例如:
这很痛苦,但如果您事先进行所有这些检查,则可以为用户提供更多描述性错误消息。
虽然您之前无法验证新密码是否曾被使用过。