UtilisateurConnecteFactory.cs 3.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. using System;
  2. using System.DirectoryServices;
  3. using System.Web;
  4. namespace CD67.ModeleMVC.MVC.Internal
  5. {
  6. public static class UtilisateurConnecteFactory
  7. {
  8. /// <summary>
  9. /// Retourne un objet UtilisateurConnecté avec les informations pronvenant de l'AD :
  10. /// nom , prenom , libellé (displayname), email , login, employéID (AstreRH), GUID, SID
  11. /// Une fois récupéré, les valeurs sont stockées en variable de session, et ne seront récupérées à nouveau depuis l'AD que si nécessaire
  12. /// </summary>
  13. /// <returns>L'utilisateur connecté</returns>
  14. public static Models.UtilisateurConnecte getUtilisateurConnecte()
  15. {
  16. //On récupère l'utilisateur depuis le cache de session
  17. Models.UtilisateurConnecte utilisateurConnecte = HttpContext.Current.Session["UtilisateurConnecte"] as Models.UtilisateurConnecte;
  18. //S'il est vide, on le met à jour
  19. if (utilisateurConnecte == null)
  20. {
  21. try
  22. {
  23. DirectoryEntry userEntry = getUserEntry();
  24. utilisateurConnecte = new Models.UtilisateurConnecte()
  25. {
  26. nom = userEntry.Properties["sn"].Value.ToString(),
  27. prenom = userEntry.Properties["givenName"].Value.ToString(),
  28. libelle = userEntry.Properties["displayName"].Value.ToString(),
  29. email = userEntry.Properties["mail"].Value.ToString(),
  30. login = userEntry.Properties["sAMAccountName"].Value.ToString(),
  31. employeeID = userEntry.Properties["employeeID"].Value == null ? (int?)null : int.Parse(userEntry.Properties["employeeID"].Value.ToString()),
  32. guid = userEntry.Properties["objectGUID"].Value as Guid?,
  33. sid = userEntry.Properties["objectSid"].Value.ToString()
  34. };
  35. HttpContext.Current.Session["UtilisateurConnecte"] = utilisateurConnecte;
  36. }
  37. catch (Exception ex)
  38. {
  39. throw new Exception("Erreur lors de l'interrogation AD", ex);
  40. }
  41. }
  42. return utilisateurConnecte;
  43. }
  44. /// <summary>
  45. /// Retourne l'entrée dans l'AD de l'utilisateur courant.
  46. /// Exemple d'accès aux propriétés : userEntry.Properties["givenName"].Value
  47. /// </summary>
  48. /// <returns>Entrée utilisateur</returns>
  49. private static DirectoryEntry getUserEntry()
  50. {
  51. try
  52. {
  53. string login = HttpContext.Current.User.Identity.Name.ToLower().Replace("cg67\\", "");
  54. if (login == null) throw new Exception("Impossible de récupérer le login de l'utilisateur courant.");
  55. DirectoryEntry ldap = new DirectoryEntry("LDAP://CG67.fr/OU=Organisation,dc=CG67,dc=fr", "LectureAD", "Adlecture!");
  56. DirectorySearcher searcher = new DirectorySearcher(ldap);
  57. searcher.Filter = $"(sAMAccountName={login})";
  58. SearchResult result = searcher.FindOne();
  59. DirectoryEntry userEntry = result.GetDirectoryEntry();
  60. return userEntry;
  61. }
  62. catch (NullReferenceException ex)
  63. {
  64. throw new Exception("Le nom d'utilisateur courant n'a pas été retrouvé dans l'AD.", ex);
  65. }
  66. catch (Exception ex)
  67. {
  68. throw new Exception("Erreur dans la récupération des infos de l'utilisateur.", ex);
  69. }
  70. }
  71. }
  72. }