针对不同上下文的LDAP第二次搜索抛出异常

时间:2017-05-22 10:47:23

标签: c# asp.net active-directory ldap

我正在使用ASP.Net实现LAD请求。我有这种方法,它第一次被称为魅力:

public static ADUser GetUser(string userName)
{
    using (var context = new PrincipalContext(ContextType.Domain, ActiveDirectoryHelper.ApplicationDomain))
    {
        using (var searcher = new DirectorySearcher())
        {
            var internalUserName = userName.Replace("@" + ActiveDirectoryHelper.ApplicationDomain, "");
            var filter = string.Format("(&(objectCategory=person)(objectClass=user)(anr={0}))", internalUserName);
            searcher.Filter = filter;

            var user = searcher.FindOne();

            var adUser = MapToUserModel(user);
            return adUser;
        }
    }
}

之后,它使用完全相同的过滤器抛出以下异常:

  <00> 000004DC:LdapErr:DSID-0C0906E8,评论:为了执行此操作   操作成功绑定必须在连接。,数据上完成   0,v1db1

2 个答案:

答案 0 :(得分:0)

我不认为错误来自您粘贴的代码。

此LDAP错误意味着您未绑定到服务器,因此无法执行操作。

在LDAP中,你必须:

  • 连接(如网络连接)到服务器
  • 向服务器进行身份验证(使用绑定操作)
在提出请求之前

之后,如果关闭绑定会话,则必须重新绑定以执行其他操作,或者如果要执行多个操作,则不必在第一个操作之后解除绑定。

LDAP是一种有状态协议,这意味着在完成connect + bind之后,您将进入一个会话,您可以在该会话中执行所需的操作,而无需重新绑定/重新连接。

答案 1 :(得分:0)

为后人。 我最终找到了对我答案的回应。我开始将LDAP查询称为异步调用。我意识到.NET运行时执行异步调用到Web环境的方式。无论如何,我通过同步和Voilà改变了我的异步调用!神奇的事情发生了。

我想知道的是幕后发生的事情。为什么异步调用会影响LDAP查询。

感谢Esteban的回答。