我正在开发基于.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实现?
答案 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