Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.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# LDAPS连接出现未知错误(0x80005000)_C#_.net_Active Directory_Ldap - Fatal编程技术网

C# LDAPS连接出现未知错误(0x80005000)

C# LDAPS连接出现未知错误(0x80005000),c#,.net,active-directory,ldap,C#,.net,Active Directory,Ldap,在过去的几个小时里,我一直被一个恼人的Active Directory位所困扰 我试图实现的是通过SSL上的LDAP连接到Active Directory。身份验证类型是匿名的。我正在使用.NETFramework4.0、C#和VisualStudio2010 以下代码应根据各种在线资源工作。但它不断地提出惊人的自我解释:“未知错误(0x80005000)” 我已经将要执行的实际查询简化为代码中的查询。但是,即使使用这个通用查询(它应该在每个广告上返回工作?),它也会返回错误。据我所知,这个错误

在过去的几个小时里,我一直被一个恼人的Active Directory位所困扰

我试图实现的是通过SSL上的LDAP连接到Active Directory。身份验证类型是匿名的。我正在使用.NETFramework4.0、C#和VisualStudio2010

以下代码应根据各种在线资源工作。但它不断地提出惊人的自我解释:“未知错误(0x80005000)”


我已经将要执行的实际查询简化为代码中的查询。但是,即使使用这个通用查询(它应该在每个广告上返回工作?),它也会返回错误。

据我所知,这个错误意味着目录路径名有问题

  • 确保“server.domainName”是您的AD服务器证书中的CN
  • 确保“some.domainName”已得到很好的解析,请在主机文件中为测试添加解析
  • 确保“域名”解析良好,并在主机文件中添加测试的解析
  • 确保颁发服务器证书的证书颁发机构的公共密钥位于您的计算机受信任的根证书颁发机构存储区中
  • 试着这样做:


  • 有时,根据目录服务器(或网络上的元素)的配置方式,可以进行简单的更改(LDAP与LDAPS,但保留端口号)

    终于

    ASP.NET应用程序似乎没有权限(或不知道如何)在计算机级别检查受信任的证书存储。由于证书是自签名的,ASP.NET应用程序拒绝建立连接

    我使用自定义证书验证修复了该问题。 下面的代码实现了这一点:

    LdapConnection con = new LdapConnection(new LdapDirectoryIdentifier("server", port));
    con.SessionOptions.SecureSocketLayer = true;
    con.SessionOptions.VerifyServerCertificate = new VerifyServerCertificateCallback(ServerCallback);
    con.Credential = new NetworkCredential(String.Empty, String.Empty);
    con.AuthType = AuthType.Basic;
    con.Bind();
    
    由于我确信证书有效,ServerCallBack方法如下所示:

    public static bool ServerCallBack(LdapConnection connection, X509Certificate certificate)
    {
        return true;
    }
    
    但是您当然可以从本地计算机检索证书并对其进行验证

    本例中使用的命名空间为:

    System.DirectoryServices.Protocols;
    
    这是因为命名空间:

    System.DirectoryServices.DirectoryEntry
    
    不包含自定义证书验证的方法


    谢谢大家的帮助和时间,希望这将在将来帮助到别人

    身份验证类型是匿名的
    。不是,您将其设置为AuthenticationTypes.SecureSocketsLayer。这可以识别发送者,所以你最好也设置用户名+密码。嗨,汉斯,我试着用一个叫做JXplorer的工具连接到广告。当设置为SSL,并且没有指定用户名或密码时,它工作得很好。好吧,请密切关注。当您指定一个有效的用户时,您是否仍然会得到E_FAIL?指定AuthenticationTypes.Anonymous时是否有效?如果确实如此,那么可以随意假设JXplorer会做一些事情,比如简单地返回到Anonymous,或者在没有指定用户的情况下使用登录的用户凭据。Hans,我尝试了指定有效用户和指定AuthenticationTypes.Anonymous。仍然是相同的非描述性错误。还有其他的窍门吗?+1,我还要补充一点,那就是确保连接到ldap服务器时不需要creds,因为您可能需要。此外,要查询ldap,您需要使用SearchRequest和SearchResponse类,而SearchResponse没有排序功能,因此您必须自己实现。我使用的不是自定义证书验证的b/c,但是WinPE中的DirectoryEntry失败了,不知道为什么,但不管怎样……您可以通过打开计算机存储的证书mmc管理单元,找到要使用的证书,授予asp.net访问计算机存储中证书的权限,右键单击>任务>管理私钥并授予网络服务读取权限。这对于使用证书的任何东西都是有用的,例如身份基础,ETCI今天找到答案,我也有同样的问题。抛出的异常不是直观的,并且浪费了很多时间来找到这个解决方案。这篇文章是非常用户满的,+1或者当然。嗨,当我在同一台windows服务器机器上运行它时,代码没有错误;但我需要从远程机器使用DirectoryEntry;在这种情况下,它不起作用;我需要做的任何其他改变?“不起作用”对我来说都不足以帮助你。道歉;我在一台远程机器上运行相同的代码,得到异常消息“服务器未运行”;我发现widows服务器证书未在远程计算机中验证;要使用“LdapConnection”API验证证书,代码位于“post”中;我的要求是我需要验证证书并使用与您相同的“DirectoryEntry”API;它帮助了我,但不确定是什么特定的广告配置导致了这种行为。另一个有趣的行为是,当您在URL中以小写形式给出ldap协议名称时,它不起作用,即“ldap://some.ldap.server:636”起作用,但ldap://some.ldap.server:636”“没有。我对此特别感到震惊。它在没有将DirectoryEntry对象上的AuthenticationType属性设置为AuthenticationTypes.SecureSocketsLayer的情况下对我有效,但我不确定这是否在所有环境和拓扑中都是一致的。
    public static bool ServerCallBack(LdapConnection connection, X509Certificate certificate)
    {
        return true;
    }
    
    System.DirectoryServices.Protocols;
    
    System.DirectoryServices.DirectoryEntry