Linux下具有dotnet核心的LDAP

时间:2019-02-22 12:25:10

标签: linux .net-core ldap

我正在开发基于.net核心(2.2.103)的应用程序,该应用程序必须连接到LDAP服务器。在运行Windows的开发计算机上,我使用了System.DirectoryServices命名空间。 但是,该应用程序将必须在Linux(Ubuntu)上运行,并且我得到了PlatformNotSupportedException,因此我添加了对 <PackageReference Include="Novell.Directory.Ldap" Version="2.2.1" />并使用它。

不幸的是,在处置Connection时,这会引发另一个PlatformNotSupportedException(但由于线程中止):

Unhandled Exception: System.PlatformNotSupportedException: Thread abort is not supported on this platform.
   at System.Threading.Thread.Abort()
   at Novell.Directory.Ldap.Connection.Dispose(Boolean disposing, String reason, Int32 semaphoreId, InterThreadException notifyUser)
   at Novell.Directory.Ldap.Connection.destroyClone(Boolean apiCall)
   at Novell.Directory.Ldap.LdapConnection.Finalize()

Linux上的dotnet核心是否有可靠的LDAP实现?

3 个答案:

答案 0 :(得分:4)

随着 .NET 5 的发布,Microsoft 为库 System.DirectoryServices.Protocols 添加了跨平台支持(windows、linux、macos)。 System.DirectoryServices 是低级 LDAP API,基于它构建。我希望他们能让 System.DirectoryServices 在未来也跨平台。

来源:.NET 5 - expanding directoryservices.protocols to linux and macos

我个人仍然使用Novell.Directory.Ldap.NETStandard,但我对此并不满意。我希望我能找到一些时间并尽快切换到 system.directoryservices.protocols 或更好的 system.directoryservices 库。

答案 1 :(得分:2)

您尝试使用的程序包的最新更新时间是2014年。它既不兼容.NET Core,也不兼容.NET Standard。

您可以改为尝试Novell.Directory.Ldap.NETStandard。尽管有名称,但它不是Novell库。 NuGet中还有其他LDAP库,但这似乎是最受欢迎的,并且仍在积极开发中。

该异常表明您也忘记了处置连接。 Finalize仅由垃圾收集器调用。

This answer显示了如何使用Novell.Directory.Ldap.NETStandard对用户进行身份验证:

public bool ValidateUser(string domainName, string username, string password)
{
   string userDn = $"{username}@{domainName}";
   try
   {
      using (var connection = new LdapConnection {SecureSocketLayer = false})
      {
         connection.Connect(domainName, LdapConnection.DEFAULT_PORT);
         connection.Bind(userDn, password);
         if (connection.Bound)
            return true;
      }
   }
   catch (LdapException ex)
   {
      // Log exception
   }
   return false;
}

该连接在using块内创建,以确保执行一离开该块的作用域就立即将其丢弃

答案 2 :(得分:2)

如果要使用跨平台解决方案,则可以使用库https://github.com/flamencist/ldap4net。该库支持集成身份验证,例如Kerberos \ gssapi \ negotiate