C#LDAP身份验证适用于一个DC,但不适用于另一个DC

时间:2013-02-01 00:08:21

标签: c#-4.0 active-directory

我有一个有趣的问题,我一直试图解决几天。

我目前正在使用运行Active Directory标准实例的Windows Server 2003计算机。

该目录包含两个域组件(DC),它们都通过我的应用程序容纳将要对目录进行授权的用户。

我正在使用:

  • 服务器的IP地址作为主机名
  • 通过端口3269进行SSL连接
  • GSS谈判认证机制
  • BaseDN,它是两个DC的父DN
  • sAMAccountName作为登录名

问题是,我无法成功授权来自DC1的任何用户,但所有属于DC2的用户都完全没问题并且工作得很好。我在DC1上收到此错误:

8009030C: LdapErr: DSID-0C09043E, comment: AcceptSecurityContext error, data 0, vece System.DirectoryServices.Protocols.LdapException: The supplied credential is invalid.

但是,使用Softerra的LDAP Broswer,我可以毫无问题地连接并授权同一个用户,因此我知道凭据是正确的。

据我所知,这两个DC的配置都是一样的...我已经浏览了它们的两个东西,任何不同的东西......但是没有找到真正突出的东西。

几个月前我发布了关于这个特定设置的内容,我正在使用的代码也在该线程中。

Set callback for System.DirectoryServices.DirectoryEntry to handle self-signed SSL certificate?

非常感谢任何帮助。

谢谢!

1 个答案:

答案 0 :(得分:1)

我能够让这个工作,但对于我的生活,我无法弄清楚为什么会这样。基本上,这个错误......

8009030C: LdapErr: DSID-0C09043E, comment: AcceptSecurityContext error, data 0, vece    System.DirectoryServices.Protocols.LdapException: The supplied credential is invalid.

......已经死了。问题是用户登录我所谓的DC2需要与域和sAMAccountName(例如LIB \ JSmith)发出绑定,而DC1只允许输入sAMAccountName。

我认为制作此程序化的最佳方法是使用主要绑定帐户来查询用户的DN。从那个DN,使用一些狡猾的RegEx,我能够捕获他们继承的域,并发出两个单独的绑定。

SearchResultEntry ResultEntry = userResponse.Entries[0];

//Let's get the root domain of the user now using our DN RegEx and that search result
Regex RegexForBaseDN = new Regex(config.LdapAuth.LdapDnRegex);
Match match = RegexForBaseDN.Match(ResultEntry.DistinguishedName);
string domain = match.Groups[1].Value;

//Try binding the user with their domain\username
try
{
    var thisUser = new NetworkCredential{
                                         Domain = domain, 
                                         UserName = username, 
                                         Password = Pin
                                        };

     //If this goes well, we'll continue forward
     ldapconn.Bind(thisUser);
}

//If that doesn't work, try biding them with the highest level domain
catch (LdapException ex)
{
     if (ex.ErrorCode.Equals(LdapErrorCodes.LDAP_INVALID_CREDENTIALS))
     {
          var thisUserOnce = new NetworkCredential{
                                                   Domain = config.LdapAuth.LdapDomain,
                                                   UserName = username,
                                                   Password = Pin
                                                  };

          //If this goes well, we'll continue forward
          ldapconn.Bind(thisUserOnce);
      }
 }

它并不像我想要的那样优雅,但它确实适用于这种特殊情况。

但是,我仍然非常感兴趣,为什么命名约定会有所不同,具体取决于用户从哪个DC继承。