【发布时间】:2015-10-23 17:56:08
【问题描述】:
我有一些使用 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 相同级别的安全性吗?文档缺乏详细信息
【问题讨论】:
标签: c# active-directory principalcontext