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);
}
}
}
}