소스 검색

NEW Accès simplifié aux propriétés AD de l'utilisateur connecté

julien.legrand 8 년 전
부모
커밋
7fcb7f24ac

+ 2 - 2
CD67.ModeleMVC.MVC/CD67.ModeleMVC.MVC.csproj

@@ -161,7 +161,8 @@
     </Compile>
     <Compile Include="Internal\MvcHtmlHelpers.cs" />
     <Compile Include="Internal\Navigation.cs" />
-    <Compile Include="Internal\Utilisateur.cs" />
+    <Compile Include="Internal\UtilisateurConnecteFactory.cs" />
+    <Compile Include="Models\UtilisateurConnecte.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
   </ItemGroup>
   <ItemGroup>
@@ -320,7 +321,6 @@
   </ItemGroup>
   <ItemGroup>
     <Folder Include="App_Data\" />
-    <Folder Include="Models\" />
   </ItemGroup>
   <ItemGroup>
     <Content Include="packages.config">

+ 0 - 116
CD67.ModeleMVC.MVC/Internal/Utilisateur.cs

@@ -1,116 +0,0 @@
-using System;
-using System.DirectoryServices;
-using System.Web;
-
-namespace CD67.ModeleMVC.MVC.Internal
-{ 
-    public static class Utilisateur
-    {
-        /// <summary>
-        /// 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.
-        /// </summary>
-        /// <param name="paramAD"></param>
-        /// <returns>"Prenom Nom" ou "NOM" ou "Prenom" ou "email" ou "login"</returns>  
-        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;
-        }
-        /// <summary>
-        /// 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.
-        /// </summary>
-        /// <param name="infoStandard"></param>
-        /// <returns name="resultat">Retourne l'information de l'AD correspondant au paramètre donné.</returns>
-        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
-        }
-
-
-        /// <summary>
-        /// Retourne l'entrée dans l'AD de l'utilisateur courant.
-        /// Exemple d'accès aux propriétés : userEntry.Properties["givenName"].Value
-        /// </summary>
-        /// <returns>Entrée utilisateur</returns>
-        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);
-            }
-        }
-    }
-}

+ 79 - 0
CD67.ModeleMVC.MVC/Internal/UtilisateurConnecteFactory.cs

@@ -0,0 +1,79 @@
+using System;
+using System.DirectoryServices;
+using System.Web;
+
+namespace CD67.ModeleMVC.MVC.Internal
+{ 
+    public static class UtilisateurConnecteFactory
+    {
+        /// <summary>
+        /// Retourne un objet UtilisateurConnecté avec les informations pronvenant de l'AD :
+        /// nom , prenom , libellé (displayname), email , login, employéID (AstreRH), GUID, SID
+        /// 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
+        /// </summary>
+        /// <returns>L'utilisateur connecté</returns>  
+        public static Models.UtilisateurConnecte getUtilisateurConnecte()
+        {
+            //On récupère l'utilisateur depuis le cache de session
+            Models.UtilisateurConnecte utilisateurConnecte = HttpContext.Current.Session["UtilisateurConnecte"] as Models.UtilisateurConnecte;
+
+            //S'il est vide, on le met à jour
+            if (utilisateurConnecte == null)
+            {
+                try
+                {
+                    DirectoryEntry userEntry = getUserEntry();
+                    utilisateurConnecte = new Models.UtilisateurConnecte()
+                    {
+                        nom = userEntry.Properties["sn"].Value.ToString(),
+                        prenom = userEntry.Properties["givenName"].Value.ToString(),
+                        libelle = userEntry.Properties["displayName"].Value.ToString(),
+                        email = userEntry.Properties["mail"].Value.ToString(),
+                        login = userEntry.Properties["sAMAccountName"].Value.ToString(),
+                        employeeID = userEntry.Properties["employeeID"].Value == null ? (int?)null : int.Parse(userEntry.Properties["employeeID"].Value.ToString()),
+                        guid = userEntry.Properties["objectGUID"].Value as Guid?,
+                        sid = userEntry.Properties["objectSid"].Value.ToString()
+                    };
+                    HttpContext.Current.Session["UtilisateurConnecte"] = utilisateurConnecte;
+                }
+                catch (Exception ex)
+                {
+                    throw new Exception("Erreur lors de l'interrogation AD", ex);
+                }
+            }
+
+            return utilisateurConnecte;
+        }
+
+        /// <summary>
+        /// Retourne l'entrée dans l'AD de l'utilisateur courant.
+        /// Exemple d'accès aux propriétés : userEntry.Properties["givenName"].Value
+        /// </summary>
+        /// <returns>Entrée utilisateur</returns>
+        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);
+            }
+        }
+    }
+}

+ 22 - 0
CD67.ModeleMVC.MVC/Models/UtilisateurConnecte.cs

@@ -0,0 +1,22 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Web;
+
+namespace CD67.ModeleMVC.MVC.Models
+{
+    /// <summary>
+    /// Classe correspondant à l'utilisateur actuelement connecté à l'application
+    /// </summary>
+    public class UtilisateurConnecte
+    {
+        public string nom {get; set; }
+        public string prenom { get; set; }
+        public string libelle { get; set; }
+        public string email { get; set; }
+        public string login { get; set; }
+        public int? employeeID { get; set; }
+        public Guid? guid { get; set; }
+        public string sid { get; set; }
+    }
+}

+ 7 - 5
CD67.ModeleMVC.MVC/Views/Shared/_Layout.cshtml

@@ -1,7 +1,9 @@
-@using CD67.ModeleMVC.MVC.Internal
-@{
+@{
     var controllerName = ViewContext.RouteData.Values["controller"].ToString();
     var actionName = ViewContext.RouteData.Values["action"].ToString();
+
+    //Récupération de l'utilisateur connecté
+    CD67.ModeleMVC.MVC.Models.UtilisateurConnecte utilisateurConnecte = CD67.ModeleMVC.MVC.Internal.UtilisateurConnecteFactory.getUtilisateurConnecte();
 }
 
 <!DOCTYPE html>
@@ -52,7 +54,7 @@
                     <li class="dropdown">
                         <a href="#" class="dropdown-toggle" data-toggle="dropdown">
                             <span class="glyphicon glyphicon-user"></span>
-                            <strong>@Utilisateur.getInfoUtilisateur(Utilisateur.InfoStandard.nom_prenom)</strong>
+                            <strong>@utilisateurConnecte.libelle</strong>
                             <span class="glyphicon glyphicon-chevron-down"></span>
                         </a>
                         <ul class="dropdown-menu">
@@ -65,8 +67,8 @@
                                             </p>
                                         </div>
                                         <div class="col-lg-8">
-                                            <p class="text-left"><strong>@Utilisateur.getInfoUtilisateur(Utilisateur.InfoStandard.login)</strong></p>
-                                            <p class="text-left small">@Utilisateur.getInfoUtilisateur(Utilisateur.InfoStandard.email)</p>
+                                            <p class="text-left"><strong>@utilisateurConnecte.login</strong></p>
+                                            <p class="text-left small">@utilisateurConnecte.email</p>
                                             <p class="text-left">
                                                 <a href="#" class="btn btn-primary btn-block btn-sm">Paramètres</a>
                                             </p>