Ako v C# získať dáta z LDAPu
Na aktuálnom pracovnom projekte som potreboval získať dáta z LDAPu, rozhodol som sa pre jazyk C# a po troche experimentovania som prišiel na jednoduché riešenie tohto problému, ktoré vám ukážem.
Na pripojenie do LDAPu je potrebné vedieť adresu, prihlasovacie meno a heslo, pripravíme preto najprv konfiguračný súbor,napríklad v XML formáte:
<?xml version="1.0" encoding="utf-8" ?>
<config>
<ldap>
<host>host</host>
<port>389</port>
<user>login</user>
<password>password</password>
<pageSize>5000</pageSize>
</ldap>
</config>
Ako ste si mohli všimnúť, do konfiguračného súboru som pridal aj parameter veľkosť stránky. Je to kvôli tomu, že z LDAPu ťahám veľké množstvo záznamov (v jednom prípade až okolo 20 000), väčšie, ako server umožňuje, je preto potreba zapnúť stránkovanie výsledkov. Hodnota 5000 platí pre server, ku ktorému sa pripájam, u vás môže byť iná, odporúčam zistiť z nastavenia alebo experimentálne.
Z LDAPu chceme dostať takýto objekt
public class LdapRole
{
public string dxrUid { get; set; }
public string Name { get; set; }
public string DN { get; set; }
public string Description { get; set; }
public List PermissionLink = new List<string>();
}
Vytvoríme si na to statickú triedu
public static class Ldap
{
#region Ldap Config
private static XDocument config = XDocument.Load("config.xml");
private static string ldapHost
{
get
{
return config.Descendants("config").Elements("ldap").First().Elements("host").First().Value;
}
}
private static int ldapPort
{
get
{
return Int32.Parse(config.Descendants("config").Elements("ldap").First().Elements("port").First().Value);
}
}
private static string userDN
{
get
{
return config.Descendants("config").Elements("ldap").First().Elements("user").First().Value;
}
}
private static string userPasswd
{
get
{
return config.Descendants("config").Elements("ldap").First().Elements("password").First().Value;
}
}
private static string domainAndUsername
{
get
{
return @"LDAP://" + ldapHost + ":" + ldapPort;
}
}
private static int pageSize
{
get
{
return Int32.Parse(config.Descendants("config").Elements("ldap").First().Elements("pageSize").First().Value);
}
}
#endregion
public static List<ldaprole> GetRoles()
{
...
}
}
A implementujeme metódu GetRoles
public static List<ldaprole> GetRoles()
{
List<ldaprole> roles = new List<ldaprole>();
DirectoryEntry entry = new DirectoryEntry(domainAndUsername + "/cn=RoleCatalogue,cn=TO2", userDN, userPasswd, AuthenticationTypes.None);
DirectorySearcher mySearcher = new DirectorySearcher(entry);
SearchResultCollection results;
mySearcher.Filter = "(objectClass=to2Role)";
mySearcher.PageSize = pageSize;
mySearcher.SearchScope = SearchScope.OneLevel;results = mySearcher.FindAll();
foreach (SearchResult resEnt in results)
{
LdapRole role = new LdapRole();
role.DN = resEnt.Path.Replace(domainAndUsername + "/", String.Empty);
ResultPropertyCollection propcoll = resEnt.Properties;
foreach (string key in propcoll.PropertyNames)
{
foreach (object values in propcoll[key])
{
switch (key.ToLower())
{
case "dxruid": role.dxrUid = values.ToString();
break;
case "description": role.Description = values.ToString();
break;
case "cn": role.Name = values.ToString();
break;
case "dxrpermissionlink": role.PermissionLink.Add(values.ToString());
break;
}
}
}
roles.Add(role);
}
return roles;
}
V tejto metóde je vytvorené LDAP spojenie do vetvy RoleCatalogue, nastavený filter na objekty typu to2Role a zanorenie len jednu úroveň a následne sú spracované výsledky. Atribúty je potrebné prechádzať v cykle, ak je nejaký atribút typu multivalue, objaví sa v cykle osobitne pre každú jeho hodnotu.