【问题标题】:System.DirectoryServices.AccountManagement and error messages from LDAP vs LDAPSSystem.DirectoryServices.AccountManagement 和来自 LDAP 与 LDAPS 的错误消息
【发布时间】: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


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2012-07-24
      • 2022-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多