using System; using System.DirectoryServices; using System.Web; namespace CD67.ModeleMVC.MVC.Internal { public static class Utilisateur { /// /// Retourne une chaine prise dans l'AD correspondant au paramètre donné à la fonction : /// prenomnom , nom , prenom , email , login /// Une fois récupéré, la valeur est stocké en variable de session, et ne sera récupéré à nouveau depuis l'AD que si nécessaire. /// Si le paramètre ne correspond à aucun de ces cas, la fonction retourne une erreur. /// /// /// "Prenom Nom" ou "NOM" ou "Prenom" ou "email" ou "login" public static string getInfoUtilisateur(string paramAD) { HttpContext context = HttpContext.Current; string resultat = ""; string sessionIndex = "UserAD-" + paramAD; if (context.Session[sessionIndex] == null) { try { DirectoryEntry userEntry = getUserEntry(); resultat = userEntry.Properties[paramAD].Value.ToString(); context.Session[sessionIndex] = resultat; } catch (NullReferenceException ex) { throw new NullReferenceException("Paramètre AD non reconnu", ex); } } else { resultat = context.Session[sessionIndex].ToString(); } return resultat; } /// /// Pour chacune des info standard que sont prenom_nom, prenom, nom, email et login, /// Renvoie la valeur qui lui correspond pour l'utilisateur courrant. /// L'info renvoyée dependra du paramètre donné à la fonction, qui devra correspondre à une des occurences de l'enum InfoStandard. /// /// /// Retourne l'information de l'AD correspondant au paramètre donné. public static string getInfoUtilisateur(InfoStandard infoStandard) { string resultat = ""; switch (infoStandard) { case InfoStandard.nom_prenom: resultat = getInfoUtilisateur("displayName"); break; case InfoStandard.prenom: resultat = getInfoUtilisateur("givenName"); break; case InfoStandard.nom: resultat = getInfoUtilisateur("sn").ToUpper(); break; case InfoStandard.email: resultat = getInfoUtilisateur("mail"); break; case InfoStandard.login: resultat = getInfoUtilisateur("sAMAccountName"); break; } return resultat; } public enum InfoStandard { nom_prenom, prenom, nom, email, login } /// /// Retourne l'entrée dans l'AD de l'utilisateur courant. /// Exemple d'accès aux propriétés : userEntry.Properties["givenName"].Value /// /// Entrée utilisateur private static DirectoryEntry getUserEntry() { try { string login = HttpContext.Current.User.Identity.Name.ToLower().Replace("cg67\\", ""); if (login == null) throw new Exception("Impossible de récupérer le login de l'utilisateur courant."); DirectoryEntry ldap = new DirectoryEntry("LDAP://CG67.fr/OU=Organisation,dc=CG67,dc=fr", "LectureAD", "Adlecture!"); DirectorySearcher searcher = new DirectorySearcher(ldap); searcher.Filter = $"(sAMAccountName={login})"; SearchResult result = searcher.FindOne(); DirectoryEntry userEntry = result.GetDirectoryEntry(); return userEntry; } catch (NullReferenceException ex) { throw new Exception("Le nom d'utilisateur courant n'a pas été retrouvé dans l'AD.", ex); } catch (Exception ex) { throw new Exception("Erreur dans la récupération des infos de l'utilisateur.", ex); } } } }