Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 能够在防火墙后使用ldap进行身份验证,但用户查询不会产生任何结果#_C#_Windows_Active Directory_Ldap_Firewall - Fatal编程技术网

C# 能够在防火墙后使用ldap进行身份验证,但用户查询不会产生任何结果#

C# 能够在防火墙后使用ldap进行身份验证,但用户查询不会产生任何结果#,c#,windows,active-directory,ldap,firewall,C#,Windows,Active Directory,Ldap,Firewall,我们在防火墙中为一个网络中的一个根active directory服务器打开了389端口,这样我们就可以验证在另一个网络上运行的网站(具有完全独立的域)的用户,为此我使用C#,并且我可以使用他们的用户名和密码很好地验证用户,但当我试图查询他的详细信息时,比如电子邮件和显示名,搜索结果什么也不返回,根本找不到用户。 我一直在互联网上寻找这种情况发生的原因,但ldap协议似乎太广泛了,我可能需要接受培训来了解原因 现在使用以下代码在控制台应用程序中进行测试: try { st

我们在防火墙中为一个网络中的一个根active directory服务器打开了389端口,这样我们就可以验证在另一个网络上运行的网站(具有完全独立的域)的用户,为此我使用C#,并且我可以使用他们的用户名和密码很好地验证用户,但当我试图查询他的详细信息时,比如电子邮件和显示名,搜索结果什么也不返回,根本找不到用户。 我一直在互联网上寻找这种情况发生的原因,但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服务器位于同一网络上的计算机上运行该代码,那么该代码工作得非常好,但是当我通过防火墙在具有相同容器的另一个网络上运行该代码时,会出现错误:

错误:System.DirectoryServices.DirectoryServicesCOMException(0x8007202B):从服务器返回了引用。

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

string container=“DC=domain,DC=local”

然后我实际上看到了文本“Authenticated”,但是搜索没有返回任何结果。 如果我使用相同的最小容器并在与ldap服务器相同的网络上运行代码,我可以再次进行身份验证,但搜索也不会返回任何结果

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

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

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

抱歉,问题太多了,但我在这个场景中迷失了方向。
谢谢你的帮助

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

如果是这样,您将需要使用全局目录(“GC://”而不是“LDAP://”)。那你就不会被推荐了。但GC是另一个端口:3268


使用“LDAP://”只能从与该域控制器相同的域获取结果。使用“GC://”将获得整个林的结果。

它们的林中是否有多个域,而您仅连接到根域

如果是这样,您将需要使用全局目录(“GC://”而不是“LDAP://”)。那你就不会被推荐了。但GC是另一个端口:3268


使用“LDAP://”只能从与该域控制器相同的域获取结果。使用“GC://”将获得整个林的结果。

林中确实有多个子域,每个位置都有相同的父域,但不同的DC,是的,我只连接到一个根服务器。但是,你是说我可以安全地关闭防火墙上的389端口,只打开3268端口,然后身份验证和用户查询都可以正常工作?我将不得不通过网络协议,使防火墙再次改变之前,我可以测试。但这听起来很有希望。没错。并确保在代码中将“LDAP://”替换为“GC://”。林中确实有多个子域,每个位置都有相同的父域,但不同的DC,是的,我只连接到一个根服务器。但是,你是说我可以安全地关闭防火墙上的389端口,只打开3268端口,然后身份验证和用户查询都可以正常工作?我将不得不通过网络协议,使防火墙再次改变之前,我可以测试。但这听起来很有希望。没错。并确保将代码中的“LDAP://”替换为“GC://”。