能够在防火墙后面使用 ldap 进行身份验证,但用户查询没有结果 c#

Able to authenticate with ldap behind firewall but user query brings no results c#

我们已经在防火墙中将端口 389 开放到一个网络中的根活动目录服务器之一,以便我们可以对另一个网络(具有完全独立的域)上的网站 运行ning 的用户进行身份验证,我'为此使用 C#,我可以使用用户名和密码很好地验证用户身份,但是当我尝试查询以获取他的详细信息(如电子邮件和显示名称)时,搜索 returns 什么都没有,用户是只是根本没有找到。 我一直在整个互联网上寻找为什么会发生这种情况,但 ldap 协议似乎太广泛了,我可能必须接受培训才能尝试理解原因。

现在使用此代码在控制台应用程序中进行测试:

try {
            string container = "DC=my,DC=corp,DC=domain,DC=local";
            var entry = new DirectoryEntry("LDAP://ip_address:389/" + container, username, password);
            object nativeObject = entry.NativeObject;

            Console.WriteLine("Authenticated");

            var searcher = new DirectorySearcher(entry);
            searcher.Filter = "samaccountname=" + username;
            var result = searcher.FindAll();
            if (result == null) {
                Console.WriteLine("User " + username + " not found in LDAP.");
                return;
            }
            foreach (SearchResult res in result) {
                var resultEntry = res.GetDirectoryEntry();
                if (resultEntry == null) {
                    Console.WriteLine("Unable to get directory entry for user " + username);
                    return;
                }
                Console.WriteLine("SAM: " + resultEntry.Properties["sAMAccountName"].Value);
            }
        }
        catch (Exception ex) {
            Console.WriteLine("Error: " + ex);
        }

如果我 运行 它在与根 ldap 服务器位于同一网络上的一台机器上,代码工作得很好,但是当我 运行 它在另一个网络上与同一个容器通过防火墙,我收到错误:

Error: System.DirectoryServices.DirectoryServicesCOMException (0x8007202B): A referral was returned from the server.

但是,如果我将容器更改为:

string container = "DC=domain,DC=local";

然后我实际上看到了文本 "Authenticated" 但随后搜索 returns 什么也没有。 如果我使用相同的最小容器和 运行 与 ldap 服务器在同一网络上的代码,我可以再次进行身份验证,但搜索 returns 什么也没有。

这告诉我容器告诉它在哪里搜索用户,我假设根服务器通过引用响应到林中实际查询的另一个 ldap 服务器 运行 来自,但可能是因为我 运行 在一个封闭的网络上运行代码,其中防火墙只为一个根服务器而不是所有 DC 打开,那么我猜无法联系推荐并且它都失败了。

是吗?这是否意味着我必须对其他网络上的所有 DC 打开防火墙?有没有办法告诉根服务器自己执行到另一个 DC 的连接并只为我获取数据?

为什么身份验证有效但查询无效?

抱歉,问题太多,但我在这种情况下迷路了。 感谢任何帮助!

他们的林中是否有多个域,而您只连接到根域?

如果是这样,您将需要使用全局目录("GC://" 而不是 "LDAP://")。那你就不会被转介了。但是GC是不同的端口:3268.

使用 "LDAP://" 只会从与该域控制器相同的域中获取结果。使用 "GC://" 会得到整个森林的结果。