1

我有一些有效的 LDAP 代码,我们在其中重新绑定到找到的用户,以便使用他的专有名称验证用户。实际上,这就是正在发生的事情:

            string userDn = @"cn=Feat Studentl+umanroleid=302432,ou=Faculty of Engineering & Physical Sciences Administration,ou=Faculty of Engineering & Physical Sciences,ou=People,o=University of TestSite,c=GB";
            string fullPath = @"LDAP://surinam.testsite.ac.uk:636/" + userDn;

            DirectoryEntry authUser = new DirectoryEntry(fullPath, userDn, "mypassword", AuthenticationTypes.None);

            authUser.RefreshCache();

但是,这会在 DirectoryEntry.Bind() 处导致错误未知错误 80005000

我怀疑问题可能是 DN 在 CN 属性中有一个“+”和一个“=”。因此,在发现逃避这种情况的方法应该是使用 \ 和字符的十六进制值之后,我尝试了这个:

            string userDn = @"cn=Feat Studentl\2Bumanroleid\3D302432,ou=Faculty of Engineering & Physical Sciences Administration,ou=Faculty of Engineering & Physical Sciences,ou=People,o=University of TestSite,c=GB";

但是我得到了错误:

登录失败:未知用户名或密码错误

我认为这是因为现在它对请求感到满意,但由于某种原因它无法匹配用户 DN。

有没有办法解决?

4

2 回答 2

1

根据我开发 LDAP 服务的经验,每当您因凭据无效而登录失败时,这往往是绑定尝试的问题。您收到该错误是因为 DirectoryEntry 不解析 DN 中的转义字符……但是,您一开始就不必这样做。

在您的代码中 - 将 AuthenticationTypes 设置为“无”会强制条目根据您提供的 DN 进行简单绑定。由于您将服务器名称作为路径的一部分,我会尝试使用 ServerBind 身份验证类型,如下所示:

string LdapPath = ("LDAP://" + ldapUrl + "/" + Domain);

//Build the user and issue the Refresh bind
var dirEntry = new DirectoryEntry
                   {
                       Path = LdapPath,
                       Username = _usernameToVerify,
                       Password = _passwordToVerify,
                       AuthenticationType = AuthenticationTypes.ServerBind
                   };

//This will load any available properties for the user
dirEntry.RefreshCache();

此外,您似乎正在对安全 LDAP 端口 (636) 进行此调用,因此请确保您还包括 AuthenticationTypes.SecureSocketsLayer 以及 ServerBind 机制:

AuthenticationType = AuthenticationTypes.ServerBind | AuthenticationTypes.SecureSocketsLayer

希望这可以帮助!

于 2013-02-19T16:10:35.703 回答
0

我不得不求助于为一位客户定制的旧 DLL 项目。

我设法让它工作。如果您有一个带有转义字符的 DN,您似乎必须参考这些低级目录服务例程。(请注意,在现实生活中,DN 是通过设置 DirectorySearcher 并首先执行 FindOne 通过初始灵活的用户搜索获得的)

 string userDn = @"cn=Feat Studentl+umanroleid=302432,ou=Faculty of Engineering & Physical Sciences Administration,ou=Faculty of Engineering & Physical Sciences,ou=People,o=University of TestSite,c=GB";
 string basicUrl = @"surinam.testsite.ac.uk:636";



  var ldapConnection = new LdapConnection(basicUrl);
  ldapConnection.AuthType = AuthType.Basic;
  LdapSessionOptions options = ldapConnection.SessionOptions;
  options.ProtocolVersion = 3;
  options.SecureSocketLayer = true;

  NetworkCredential credential = new NetworkCredential(userDn, password);                             
  ldapConnection.Credential = credential;

  try
  {
      ldapConnection.Bind();
      Console.WriteLine("bind succeeded ");
  }
  catch (LdapException e)
  {
      if (e.ErrorCode == 49)
      {
           Console.WriteLine("bind failed ");
      }
      else
      {
          Console.WriteLine("unexpected result " + e.ErrorCode);
      }
  }
  catch (DirectoryOperationException e)
  {
      Console.WriteLine("unexpected error " + e.Message);
  }
于 2013-02-20T13:02:31.300 回答