我有一个有趣的问题,我一直试图解决几天。
我目前正在使用运行Active Directory标准实例的Windows Server 2003计算机。
该目录包含两个域组件(DC),它们都通过我的应用程序容纳将要对目录进行授权的用户。
我正在使用:
问题是,我无法成功授权来自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?
非常感谢任何帮助。
谢谢!
答案 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继承。