【问题标题】:LDAPConnection Bind timeout in .net core.net 核心中的 LDAPConnection 绑定超时
【发布时间】:2021-11-26 08:13:51
【问题描述】:

我在 .net 核心中找不到任何有关 LdapConnection 绑定超时的信息。一种解决方案是LdapConnection Bind Timeout,但它不适用于 .net 核心。 LdapConnection 超时和绑定超时似乎是不同的事情。 我的代码类似于以下

   var credentials = new NetworkCredential(obj.AdminBindUserName, obj.AdminBindPassword);

            if (obj.LDAPAddressPort.HasValue && obj.LDAPAddressPort > 0)
            {
                connection = new LdapConnection(new LdapDirectoryIdentifier(obj.LDAPAddress, obj.LDAPAddressPort.Value, false, false));
                //connection = new LdapConnection(new LdapDirectoryIdentifier(obj.LDAPAddress, obj.LDAPAddressPort));connection = new LdapConnection(new LdapDirectoryIdentifier(obj.LDAPAddress, obj.LDAPAddressPort));
            }
            else
            {
                connection = new LdapConnection(obj.LDAPAddress);
            }
             //connection.Timeout = new TimeSpan(0,0,5);   
            connection.SessionOptions.ProtocolVersion = 3;
            connection.AuthType = AuthType.Basic;           
            connection.Bind(credentials);

我尝试过连接超时,但似乎没有效果。 我收到异常消息 ExceptionCode:81,消息:LDAP 服务器在随机时间间隔不可用。有时18秒,有时超过一分钟。 我正在通过 vpn 连接的帮助重现问题。我的本地 ldap 是通过首先连接到某个 vpn 来连接的。 通过 vpn 连接,一切正常。但如果没有 vpn,我对 Bind() 方法的调用会无限期等待

【问题讨论】:

  • 有人可以帮我吗?
  • 不清楚你想用超时做什么。 " LDAP 服务器在随机时间间隔不可用。" 如果您的 ldap 服务器不稳定,这是首先要解决的问题。我会尝试 1. ssh 到运行 slapd 的机器,然后以随机时间间隔 ldapwhoami 并检查响应时间,如果可以,然后 2. ssh 到运行 .net 的机器并做同样的事情,或者只是 telnet ldap 并再次检查响应时间,看看是服务器问题还是网络问题。
  • 我的简单问题是在绑定期间不应该有无限的等待时间。应该有一些绑定超时属性可以在内部完成。您可以通过 dllimport 查看引用的帖子。 telnet 到机器是我也会做的一种解决方法,但这意味着在每次通话之前我必须先 telnet 然后进行实际通话。有时我们得到的 ldpa 服务器 url 不是 ip 格式。然后会有额外的工作。帖子中添加了一些其他详细信息
  • 好的。设置超时是一回事,但它不会阻止根本问题,我的建议只是为了帮助解决问题,它们不是解决方法。
  • 通过设置超时,我的 api 调用将有一些最大时间间隔来获得响应。无限期的绑定等待是一种阻碍。

标签: .net-core ldap


【解决方案1】:

可以使用 Task 设置超时,一旦达到秒超时,就会发生取消事件以摆脱这种情况,如下所示

if (obj.IsBindTimeLimit)
            {
                int timeoutSecond = obj.BindTimeOutInSeconds;
                if (timeoutSecond <= 0)
                {
                    timeoutSecond = 5;
                }
                CancellationToken tscancel = new CancellationToken();
                Task t = Task.Run(() =>
                {
                    var credentials = new NetworkCredential(obj.AdminBindUserName, obj.AdminBindPassword);
                    if (obj.LDAPAddressPort.HasValue && obj.LDAPAddressPort > 0)
                    {
                        connection = new LdapConnection(new LdapDirectoryIdentifier(obj.LDAPAddress, obj.LDAPAddressPort.Value, false, false));
                    }
                    else
                    {
                        connection = new LdapConnection(obj.LDAPAddress);
                    }                  
                    connection.SessionOptions.ProtocolVersion = 3;
                    connection.AuthType = AuthType.Basic;
                    connection.Bind(credentials);
                });
              
                if (!t.Wait(timeoutSecond * 1000, tscancel))
                {                    
                    throw new TimeoutException("The timeout interval elapsed");
                }

            }
            else
            {
                var credentials = new NetworkCredential(obj.AdminBindUserName, obj.AdminBindPassword);
                if (obj.LDAPAddressPort.HasValue && obj.LDAPAddressPort > 0)
                {
                    connection = new LdapConnection(new LdapDirectoryIdentifier(obj.LDAPAddress, obj.LDAPAddressPort.Value, false, false));
                }
                else
                {
                    connection = new LdapConnection(obj.LDAPAddress);
                }               
                connection.SessionOptions.ProtocolVersion = 3;
                connection.AuthType = AuthType.Basic;
                connection.Bind(credentials);
            }

【讨论】:

    猜你喜欢
    • 2021-09-23
    • 2020-08-23
    • 1970-01-01
    • 1970-01-01
    • 2017-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-04
    相关资源
    最近更新 更多