Sledujte ma na Twitteri

Ako v C# získať dáta z LDAPu

Kategória: .NET, C#, publikované: 06.05.2010, autor: Igor Kulman

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:

  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <config>
  3. <ldap>
  4. <host>host</host>
  5. <port>389</port>
  6. <user>login</user>
  7. <password>password</password>
  8. <pageSize>5000</pageSize>
  9. </ldap>
  10.  
  11. </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

  1. public class LdapRole
  2. {
  3. public string dxrUid { get; set; }
  4. public string Name { get; set; }
  5. public string DN { get; set; }
  6. public string Description { get; set; }
  7. public List PermissionLink = new List<string>();
  8. }
  9.  

Vytvoríme si na to statickú triedu

  1. public static class Ldap
  2. {
  3. #region Ldap Config
  4. private static XDocument config = XDocument.Load("config.xml");
  5. private static string ldapHost
  6. {
  7. get
  8. {
  9. return config.Descendants("config").Elements("ldap").First().Elements("host").First().Value;
  10. }
  11. }
  12. private static int ldapPort
  13. {
  14. get
  15. {
  16. return Int32.Parse(config.Descendants("config").Elements("ldap").First().Elements("port").First().Value);
  17. }
  18. }
  19. private static string userDN
  20. {
  21. get
  22. {
  23. return config.Descendants("config").Elements("ldap").First().Elements("user").First().Value;
  24. }
  25. }
  26. private static string userPasswd
  27. {
  28. get
  29. {
  30. return config.Descendants("config").Elements("ldap").First().Elements("password").First().Value;
  31. }
  32. }
  33. private static string domainAndUsername
  34. {
  35. get
  36. {
  37. return @"LDAP://" + ldapHost + ":" + ldapPort;
  38. }
  39. }
  40. private static int pageSize
  41. {
  42. get
  43. {
  44. return Int32.Parse(config.Descendants("config").Elements("ldap").First().Elements("pageSize").First().Value);
  45. }
  46. }
  47. #endregion
  48. public static List<ldaprole> GetRoles()
  49.  
  50. {
  51. ...
  52. }
  53. }

A implementujeme metódu GetRoles

  1. public static List<ldaprole> GetRoles()
  2. {
  3.  
  4. List<ldaprole> roles = new List<ldaprole>();
  5.  
  6. DirectoryEntry entry = new DirectoryEntry(domainAndUsername + "/cn=RoleCatalogue,cn=TO2", userDN, userPasswd, AuthenticationTypes.None);
  7.  
  8. DirectorySearcher mySearcher = new DirectorySearcher(entry);
  9. SearchResultCollection results;
  10. mySearcher.Filter = "(objectClass=to2Role)";
  11. mySearcher.PageSize = pageSize;
  12. mySearcher.SearchScope = SearchScope.OneLevel;results = mySearcher.FindAll();
  13.  
  14. foreach (SearchResult resEnt in results)
  15. {
  16.  
  17. LdapRole role = new LdapRole();
  18. role.DN = resEnt.Path.Replace(domainAndUsername + "/", String.Empty);
  19. ResultPropertyCollection propcoll = resEnt.Properties;
  20.  
  21. foreach (string key in propcoll.PropertyNames)
  22. {
  23.  
  24.  
  25. foreach (object values in propcoll[key])
  26. {
  27.  
  28. switch (key.ToLower())
  29. {
  30. case "dxruid": role.dxrUid = values.ToString();
  31. break;
  32. case "description": role.Description = values.ToString();
  33. break;
  34. case "cn": role.Name = values.ToString();
  35. break;
  36. case "dxrpermissionlink": role.PermissionLink.Add(values.ToString());
  37. break;
  38. }
  39. }
  40. }
  41. roles.Add(role)
  42. ;}return roles;
  43. }

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.

Sledujte moje články: vybrali.sme.sk Linkuj.cz  

Zopár zaujímavosti o pražskom metre
Minulý týždeň som sa zúčastnil prehliadky závodu Siemens Mobility v Depe Kačerov. Je to prevádzka, ktorú Siemens... čítať ďalej

Polemika nad Live službami od Microsoftu
Live služby od Microsoftu sú na trhu už dlhší čas. Microsoft nám ponúka email, kalendár, komunikátor, fotografie... čítať ďalej

Komentáre

RSS komentárovRSS komentárov

K článku "Ako v C# získať dáta z LDAPu" zatiaľ nie sú žiadne komentáre.

 

Pridať komentár

(povinné)

(povinný,nezverejňuje sa)


Odoslať komentár

Autor

Igor Kulman Igor Kulman at LinkeIn
Igor Kulman at Flick
Igor Kulman at Twitter
Igor Kulman at Posterous

Autor je absolventom softvéroveho inžinierstva na Univerzite Karlovej v Prahe, pracuje ako Windows Phone 7 vývojár v Inmite a pôsobil aj ako prispievateľ počítačového magazínu.

Kategórie

Náhodná referencia

Koláčiky

Koláčiky