LdapForNet 1.0.1
See the version list below for details.
dotnet add package LdapForNet --version 1.0.1
NuGet\Install-Package LdapForNet -Version 1.0.1
<PackageReference Include="LdapForNet" Version="1.0.1" />
paket add LdapForNet --version 1.0.1
#r "nuget: LdapForNet, 1.0.1"
// Install LdapForNet as a Cake Addin
#addin nuget:?package=LdapForNet&version=1.0.1
// Install LdapForNet as a Cake Tool
#tool nuget:?package=LdapForNet&version=1.0.1
ldap4net
Port of OpenLdap Client library (https://www.openldap.org/software/man.cgi?query=ldap) to DotNet Core
It works with any LDAP protocol compatible directory server (including Microsoft Active Directory).
Supported SASL GSSAPI (Kerberos) authentication!
Sample usage (GSSAPI authentication)
using (var cn = new LdapConnection())
{
// connect
cn.Connect();
// bind using kerberos credential cache file
cn.Bind();
// call ldap op
var entries = cn.Search("<<basedn>>", "(objectClass=*)");
}
Overview
Supported platforms
- Most of popular Linux distributives
- Supported on the .NET Standard - minimum required is 2.0 - compatible .NET runtimes: .NET Core, Mono.
Installation
Install-Package LdapForNet -Version 0.1.0-beta
dotnet add package LdapForNet --version 0.1.0-beta
Api
Connect
using (var cn = new LdapConnection())
{
// connect use Domain Controller host from computer hostname and default port 389
// Computer hostname - mycomp.example.com => DC host - example.com
cn.Connect();
....
}
using (var cn = new LdapConnection())
{
// connect use hostname and port
cn.Connect("dc.example.com",636);
....
}
Bind
using (var cn = new LdapConnection())
{
cn.Connect();
// bind using kerberos credential cache file
cn.Bind();
...
}
using (var cn = new LdapConnection())
{
cn.Connect("ldap.forumsys.com");
// bind using userdn and password
cn.Bind(LdapAuthMechanism.SIMPLE,"cn=read-only-admin,dc=example,dc=com","password");
...
}
Search
using (var cn = new LdapConnection())
{
cn.Connect();
cn.Bind();
//search all objects in catalog (default search scope = LdapSearchScope.LDAP_SCOPE_SUBTREE)
var entries = cn.Search("dc=example,dc=com","(objectClass=*)");
}
using (var cn = new LdapConnection())
{
cn.Connect();
cn.Bind();
//search objects in catalog at first level scope
var entries = cn.Search("dc=example,dc=com","(objectClass=*)", LdapSearchScope.LDAP_SCOPE_ONELEVEL);
}
SearchByCn
using (var cn = new LdapConnection())
{
cn.Connect();
cn.Bind();
//search by CN, get @base from machine hostname (my.example.com => dn=example,dn=com )
var entries = cn.SearchByCn("read-only-admin");
}
using (var cn = new LdapConnection())
{
cn.Connect();
cn.Bind();
//search by CN
var entries = cn.SearchByCn("ou=admins,dn=example,dn=com", "read-only-admin", LdapSearchScope.LDAP_SCOPE_ONELEVEL);
}
SearchBySid
using (var cn = new LdapConnection())
{
cn.Connect();
cn.Bind();
//search by CN, get @base from machine hostname (my.example.com => dn=example,dn=com )
var entries = cn.SearchBySid("S-1-5-21-2127521184-1604012920-1887927527-72713");
}
using (var cn = new LdapConnection())
{
cn.Connect();
cn.Bind();
//search by CN
var entries = cn.SearchBySid("ou=admins,dn=example,dn=com", "S-1-5-21-2127521184-1604012920-1887927527-72713", LdapSearchScope.LDAP_SCOPE_ONELEVEL);
}
SetOption
using (var cn = new LdapConnection())
{
cn.Connect();
var ldapVersion = (int)LdapVersion.LDAP_VERSION3;
cn.SetOption(LdapOption.LDAP_OPT_PROTOCOL_VERSION, ref ldapVersion);
cn.Bind();
}
Add
using (var cn = new LdapConnection())
{
cn.Connect();
cn.Bind();
cn.Add(new LdapEntry
{
Dn = "cn=test,dc=example,dc=com",
Attributes = new Dictionary<string, List<string>>
{
{"sn", new List<string> {"Winston"}},
{"objectclass", new List<string> {"inetOrgPerson"}},
{"givenName", new List<string> {"your_name"}},
{"description", new List<string> {"your_description"}}
}
});
}
Modify
using (var cn = new LdapConnection())
{
cn.Connect();
cn.Bind();
cn.Modify(new LdapModifyEntry
{
Dn = "cn=test,dc=example,dc=com",
Attributes = new List<LdapModifyAttribute>
{
new LdapModifyAttribute
{
LdapModOperation = LdapModOperation.LDAP_MOD_REPLACE,
Type = "givenName",
Values = new List<string> {"test_value_2"}
},
new LdapModifyAttribute
{
LdapModOperation = LdapModOperation.LDAP_MOD_ADD,
Type = "displayName",
Values = new List<string> {"test_display_name"}
},
new LdapModifyAttribute
{
LdapModOperation = LdapModOperation.LDAP_MOD_ADD,
Type = "sn",
Values = new List<string> {"test"}
},
new LdapModifyAttribute
{
LdapModOperation = LdapModOperation.LDAP_MOD_DELETE,
Type = "description",
Values = new List<string> {"test_value"}
}
}
});
}
Delete
using (var cn = new LdapConnection())
{
cn.Connect();
cn.Bind();
cn.Delete("cn=test,dc=example,dc=com");
}
Rename
using (var cn = new LdapConnection())
{
cn.Connect();
cn.Bind();
cn.Rename("cn=test,dc=example,dc=com", "cn=test2", null, true);
}
GetNativeLdapPtr
For own implementations or not implemented OpenLdap functions use GetNativeLdapPtr
. It's provided pointer to native structure LDAP. So we can use this pointer in own implementations.
For example, implement "DIGEST-MD5" authentication
using static LdapForNet.Native.Native;
using (var cn = new LdapConnection())
{
cn.Connect();
var ld = cn.GetNativeLdapPtr();
var defaults = new LdapSaslDefaults {
mech = "DIGEST-MD5",
passwd="password",
authcid="user",
realm="realm.com",
authzid="user"
};
var ptr = Marshal.AllocHGlobal(Marshal.SizeOf(defaults));
Marshal.StructureToPtr(defaults, ptr, false);
int rc = ldap_sasl_interactive_bind_s( ld, null,defaults.mech, IntPtr.Zero, IntPtr.Zero,
(uint)LdapInteractionFlags.LDAP_SASL_QUIET, (l, flags, d, interact) => (int)LdapResultCode.LDAP_SUCCESS, ptr);
...
}
Native
OpenLdap native methods can be used directly. Native methods implemented in static class LdapForNet.Native.Native
:
using static LdapForNet.Native.Native;
using (var cn = new LdapConnection())
{
cn.Connect();
var ld = cn.GetNativeLdapPtr();
var res = ldap_sasl_interactive_bind_s(ld,...);
if (res != (int)LdapResultCode.LDAP_SUCCESS)
{
Trace.TraceError($"Error {method}: {LdapError2String(res)} ({res}).");
}
}
License
This software is distributed under the terms of the MIT License (MIT).
Authors
Alexander Chermyanin / LinkedIn
Contributions and bugs reports are welcome.
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. |
.NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
.NET Standard | netstandard2.0 is compatible. netstandard2.1 was computed. |
.NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
MonoAndroid | monoandroid was computed. |
MonoMac | monomac was computed. |
MonoTouch | monotouch was computed. |
Tizen | tizen40 was computed. tizen60 was computed. |
Xamarin.iOS | xamarinios was computed. |
Xamarin.Mac | xamarinmac was computed. |
Xamarin.TVOS | xamarintvos was computed. |
Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.0
- No dependencies.
NuGet packages (17)
Showing the top 5 NuGet packages that depend on LdapForNet:
Package | Downloads |
---|---|
Volo.Abp.Ldap
Package Description |
|
Aiwins.Rocket.Ldap
Package Description |
|
Informatique.Base.Core
Base classed used in Project in Core |
|
CAdESLib
This is rework of https://github.com/nonorganic/dssnet |
|
Informatique.UOB.Base.Core
Base classed used in UOB Project in Core |
GitHub repositories (2)
Showing the top 2 popular GitHub repositories that depend on LdapForNet:
Repository | Stars |
---|---|
abpframework/abp
Open Source Web Application Framework for ASP.NET Core. Offers an opinionated architecture to build enterprise software solutions with best practices on top of the .NET and the ASP.NET Core platforms. Provides the fundamental infrastructure, production-ready startup templates, application modules, UI themes, tooling, guides and documentation.
|
|
abpframework/abp-samples
Sample solutions built with the ABP Framework
|
Version | Downloads | Last updated |
---|---|---|
2.7.15 | 718,363 | 3/26/2022 |
2.7.14 | 47,486 | 1/31/2022 |
2.7.13 | 186,309 | 7/6/2021 |
2.7.12 | 28,177 | 5/28/2021 |
2.7.11 | 312,224 | 10/12/2020 |
2.7.10 | 17,152 | 9/18/2020 |
2.7.9 | 3,251 | 9/9/2020 |
2.7.8 | 1,199 | 9/8/2020 |
2.7.7 | 1,178 | 9/7/2020 |
2.7.6 | 1,352 | 9/2/2020 |
2.7.5 | 1,177 | 9/1/2020 |
2.7.4 | 2,150 | 8/27/2020 |
2.7.3 | 1,106 | 8/27/2020 |
2.7.2 | 18,921 | 7/17/2020 |
2.7.1 | 15,605 | 6/15/2020 |
2.7.0 | 1,182 | 6/13/2020 |
2.6.0 | 1,506 | 5/31/2020 |
2.5.0 | 2,420 | 5/25/2020 |
2.4.1 | 1,229 | 5/17/2020 |
2.4.0 | 12,506 | 5/7/2020 |
2.3.0 | 5,035 | 3/22/2020 |
2.2.1 | 1,296 | 3/5/2020 |
2.2.0 | 2,384 | 1/13/2020 |
2.1.0 | 1,288 | 1/4/2020 |
2.0.0 | 1,930 | 7/30/2019 |
1.1.0 | 1,291 | 7/2/2019 |
1.0.1 | 1,804 | 1/5/2019 |
0.2.0-beta | 1,207 | 1/4/2019 |
0.1.0-beta | 1,486 | 7/3/2018 |
0.0.6-alpha | 1,682 | 3/27/2018 |
0.0.5-alpha | 1,576 | 3/1/2018 |
0.0.4-alpha | 1,426 | 2/28/2018 |
0.0.3-alpha | 1,521 | 2/27/2018 |
0.0.2-alpha | 1,491 | 2/25/2018 |
0.0.1-alpha | 1,503 | 2/22/2018 |
stable version