Partage
  • Partager sur Facebook
  • Partager sur Twitter

Authentification web.config avec Active Directory

Sujet résolu
    20 février 2019 à 11:24:25

    Bonjour,

    J'ai suivie ce tutoriel https://morpheus.developpez.com/addotnet/ADCSharp/ pour m'aider pour l'authentification Ldap. Mais il n'y a rien dessus en ce qui concerne le fichier web.config pour l'authentification avec Active Directory. Est-ce que je dois faire un provider ? 

    J'aurais bien aimé quelque chose d'aussi simple que ça (juste mettre une balise authentification) à mettre : 

    <system.web>
        <compilation debug="true" targetFramework="4.6.1" />
        <httpRuntime targetFramework="4.6.1" />
        <httpModules>
          <add name="TelemetryCorrelationHttpModule" type="Microsoft.AspNet.TelemetryCorrelation.TelemetryCorrelationHttpModule, Microsoft.AspNet.TelemetryCorrelation" />
        </httpModules>
      </system.web>
      <authentication mode="Forms">
        <forms loginUrl="~/Login/Login" />
      </authentication>

    Mais ça , bien sûr celà ne fonctionne pas pas dans le cas d'une Ldap. 

    Quelque chose comme ça me tente bien aussi, mais elle n'est pas complète et ne fonctionne pas  : 

    <system.web>
      <authorization>
        <allow roles="DOMAIN\MYGROUP"/>
        <deny users="*"/>        
      </authorization>
    </system.web>


    Et Je me demande dans l'exemple ci-dessus ou je peux mettre mon LoginUrl .

    j'ai vue une super réponse sur stackOverflow, mais j'ai du mal ^^" 

    https://stackoverflow.com/questions/51952214/implement-active-directory-login-in-an-existing-asp-net-mvc-4-6-web-project

    Avez-vous des conseil ?

    Merci

    • Partager sur Facebook
    • Partager sur Twitter
      20 février 2019 à 12:13:48

      Au vu du message d'erreur, c'est qu'il manque un truc dans l'élément XML "configuration" en début de fichier "web.config" pour interpréter la section "authentication" de ce même fichier.

      Qu'est-ce que vous ne comprenez pas dans la réponse sur StackOverflow ?

      • Partager sur Facebook
      • Partager sur Twitter
      Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
        20 février 2019 à 14:52:26

        Merci ,

        j'ai finalement résolue l'erreur avec l'élement qui manque dans le fichier web.config. J'avais placé au mauvais endroit ma balise Authentication mode ( il faut la mettreà l'intérieur de system Web, et non en dessous) 

          <system.web>
            <httpCookies httpOnlyCookies="true" />
            <authentication mode="Forms">
              <forms name=".ADAuthCookie" loginUrl="~/Login/Login" timeout="30" slidingExpiration="true" protection="All" />
            </authentication>
            <authorization>

        Pour la réponse de StackOver flow, je n'ai pas exactement pareille que lui dans ma méthode Login :

         [HttpPost]
                [ValidateAntiForgeryToken]
                public ActionResult Login(LoginViewModel loginviewmodel)
                {
        
                    if (loginviewmodel.authentification(loginviewmodel.user_login, loginviewmodel.user_password, this.domain))
                    {
                        
                        return RedirectToAction("Index");
                    }
                    else
                        return View();
        
                }

        authentification est une méthode qui renvoie true ou false, selon si l'utilisateur et bien connecté. SI il est bien connecté alors je l'envoie sur la page index, sinon il reste sur la page connexion. Déjà ici, ca ne fonctionne pas. J'ai cette erreur :



        Ici je ne comprend pas, pourquoi l'utilisateur n'a plus accès à la page Login, et aussi pourquoi ça me renvoie pas sur index. Ca me fait bizarre aussi de mettre uniquement return RedirectToAction("Index") dans ma méthode.

        Sur le poste StackOverflow , c'est la partie provider que je ne comprend pas.

         <membership defaultProvider="ADMembershipProvider">
            <providers>
              <clear />
              <add name="ADMembershipProvider" type="System.Web.Security.ActiveDirectoryMembershipProvider" connectionStringName="ADConnectionString" attributeMapUsername="sAMAccountName" connectionUsername="******" connectionPassword="******" />
            </providers>
          </membership>

        Je ne sais pas quoi mettre dans mon cas

         connectionStringName="ADConnectionString" attributeMapUsername="sAMAccountName" 
        connectionUsername="******"

        Ou trouver ma connexion ? elle resemble à quoi ? 

        attributMapUsername, correspond à quoi? Ca ressemble à quoi ? 

        Pourquoi mettre des étoiles à connectionUsername ? une seul j'aurais compris , mais plusieurs ? 

        et enfin ca veux dire quoi pour lui ADMembershipProvider ? Je dois créee une méthode qui s'appelle comme ça? Ma méthode qui me permet de savoir si quelqu'un est authentifié ne suffit t-elle pas ? 

         public bool authentification(string username, string passwd, string domain)
                {
                    domain = this.domainAt;
                    try
                    {
                        //connexion à l'annuaire Active Directory
                        DirectoryEntry entry = new DirectoryEntry("LDAP://" + domain, username, passwd, AuthenticationTypes.Secure);
                        DirectorySearcher search = new DirectorySearcher(entry);
                        //Filter est le filtre, ici on filtre selon l'objet utilisateur
                        search.Filter = "(&(samaccountname=" + username + ")(objectClass=user))";
                        search.SearchScope = SearchScope.Subtree;
        
                        /* on liste les differents utilisateurs présent dans l'ad à l'aide de DirectorySearcher et la methode FindAll */
                        foreach (SearchResult element in search.FindAll())
                        {
                            for (int i = 0; i < element.Properties["memberOf"].Count; i++)
                            {
                                if (element.Properties["memberOf"][i].ToString().Split(new string[] { ",", "=" }, StringSplitOptions.None)[1].ToString() == "NOM DU MON GROUPE ICI")
                                {
                                    Boolauthentification = true;
        
                                    return Boolauthentification;
                                }
                                else
                                {
                                    Boolauthentification = false;
                                }
                            }
                        }
        
                        if (Boolauthentification == false)
                        {
        
                        }
                    }
                    catch (Exception ex)
                    {
                        //erreur 
                        Console.WriteLine(ex.Message);
        
        
                        System.Diagnostics.StackFrame sf = new System.Diagnostics.StackFrame();
                        string methodName = this.GetType().Name + "_" + sf.GetMethod().Name;
                    }
                    Boolauthentification = false;
                    return Boolauthentification;
                }
            }


        Voilà un peu près toute mes question que je me pose ^^'

        • Partager sur Facebook
        • Partager sur Twitter
          22 février 2019 à 17:55:03

          Bin, déjà, sans l'attribut "[AllowAnonymous]" sur la méthode "Login", ça le fera moyen, non ? o_O

          >Ou trouver ma connexion ? elle resemble à quoi ?

          C'est le login/password qui va servir à l'interrogation de LDAP. LDAP, c'est un annuaire, mais il est pas ouvert à tout le monde. Il faut voir avec tes administrateurs réseaux pour avoir un login/password ayant les droits pour interroger le LDAP sur la partie de l'annuaire qui t'intéresse.

          >attributMapUsername, correspond à quoi?

          C'est le nom de la propriété LDAP qui sera comparé à la valeur du "login" lors de la requête.

          >Pourquoi mettre des étoiles à connectionUsername ? une seul j'aurais compris , mais plusieurs ?

          C'est juste que vous devez les remplir avec vos valeurs.

          >et enfin ca veux dire quoi pour lui ADMembershipProvider ?

          Nom arbitraire, AD pour "Active Directory" je pense, car dans un domaine Windows, LDAP est une interface de requêtage de l'Active Directory du domaine Windows.

          "MembershipProvider" car il tient le rôle d'Authentification mais aussi fournit les groupes dont fait partie l'utilisateur, une fois connecté.

          >Ma méthode qui me permet de savoir si quelqu'un est authentifié ne suffit t-elle pas ?

          Oui, peut-être, mais lui, ajoute les aspects groupes pour pouvoir finement gérer les droits d'accès aux autres pages de l'application.

          • Partager sur Facebook
          • Partager sur Twitter
          Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
            26 février 2019 à 11:34:30

            Yhouua, merci beaucoup pour toute ces explications. J'ai bien galérer sur cette fonction login. Je remercie tout les gens qui m'ont aidés x)

            Sur ce sujet, j'ai un problème technique pour modifier mon poste, et c'es aussi pour ça que mon Markdown ne fonctionne pas. (j'ai informé le support techniques, mais ça c'est un autre sujet XD ). 

            J'ai finalement, fait une authentification par formulaire (sans les providers) 


             <authentication mode="Windows">
                  <forms loginUrl="~/Login/Login" timeout="2880" />
                </authentication>

            Bon finalement, j'ai mis windows (les droit anonyme sont activer dans mon projet) car cela fonctionne sans erreur, mais avec form ca devrait fonctionnait aussi.

            Pour cela j'ai rajouter dans ma fonction d'authentification : 


            //alors l'utilisateur se connecte
                                            System.Web.Security.FormsAuthentication.SetAuthCookie(testUser.id.ToString(), false);


            C'est cette partie qui gère le cookie de l'authentification 

            Et pour mon controleur login, ca ressemble à ça : 

             // GET: Login
                    [AllowAnonymous]
                    public ActionResult Login()
                    {
                        LoginViewModel viewModel = new LoginViewModel { Authentifie = HttpContext.User.Identity.IsAuthenticated };
            
                        //on verifie si l'utilisateur est connecté
                        if (HttpContext.User.Identity.IsAuthenticated)
                        {
                            //récupére l'object utilisateur à l'aide de son id
                            var RecupId = int.Parse(HttpContext.User.Identity.Name);
                            viewModel.users = UserMethod.ObtainUsers(HttpContext.User.Identity.Name); 
                        }
                        return View(viewModel);
                    }
            
                    [HttpPost]
                    [AllowAnonymous]
                    [ValidateAntiForgeryToken]
                    public ActionResult Login(LoginViewModel loginviewmodel, string returnUrl)
                    {
                        {
            
                            if (loginviewmodel.authentification(loginviewmodel.user_login, loginviewmodel.user_password, "Nom de votre domaine"))
                            {
            
                                return RedirectToAction("Index", "Home");
            
                            }
            
                            else
                                return this.View(loginviewmodel);
                        }
                    }
            
                    /* deconnexion */
                    public ActionResult LogOff()
                    {
                        FormsAuthentication.SignOut();
                        Session.Abandon();
                        return Redirect("/"); ;
                    }

            Au final la méthode authentification, ressemble à ça :

            public bool authentification(string username, string passwd, string domain)
                    {
                        domain = this.domainAt;
                        try
                        {
                            //connexion à l'annuaire Active Directory
                            DirectoryEntry entry = new DirectoryEntry("LDAP://DC=blablabla,DC=blablabla, DC=blaba", username, passwd, AuthenticationTypes.Secure);
                            DirectorySearcher search = new DirectorySearcher(entry);
                            //Filter est le filtre, ici on filtre selon l'objet utilisateur
                            search.Filter = "(&(samaccountname=" + username + ")(objectClass=user))";
                            search.SearchScope = SearchScope.Subtree;
            
                            /* on liste les differents utilisateurs présent dans l'ad à l'aide de DirectorySearcher et la methode FindAll , je pense meme ne plus avoir besoin du foreach */
                            foreach (SearchResult element in search.FindAll())
                            {
                                    //l'objet context
                                    PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "Nom de notre domain");
                                    
                                    // on recherche dans L'ad l'utilisateur et le groupe  
                                    UserPrincipal user = UserPrincipal.FindByIdentity(ctx, username);
                                    GroupPrincipal group = GroupPrincipal.FindByIdentity(ctx, "Nom du groupe");
                                    // Renvoie la liste de tout les groupes et les sous groupes
                                    PrincipalSearchResult < Principal > groupName = user.GetAuthorizationGroups();
            
                                    //on recherche si l'utilisateur possède ce groupe, any permet de renvoyer true dès qu'on trouve la 1ere l'occurance du groupePrincipal 
                                    bool IsMember = groupName.OfType<GroupPrincipal>().Any(g => g.Name.Equals("Nom du groupe", StringComparison.OrdinalIgnoreCase));
                                    //bool IsMember = user.IsMemberOf(group);
            
                                    // si Ismember=true alors l'utilisateur est authentifier et on rentre les informations dans la base de donnée.
                                    if (IsMember)
                                    {
                                        Boolauthentification = true;
            
                                        var testUser = db.users.Where(x => x.user_login.Equals(username)).FirstOrDefault();
            
                                        if (testUser == null)
                                        {
                                            var newUser = new users();
                                            //les differents champs récupérés
                                            newUser.user_login = username;
              
                                            newUser.first_name= element.Properties["GivenName"][0].ToString();
                                            newUser.email ="blabla@Cielphis.com";
            
                                            //enregistrement en bdd
                                            db.users.Add(newUser);
                                            db.SaveChanges();
                                        }
                                        // si TestUser contient déjà des données et que l'authentification à réussi
                                        if ( (Boolauthentification) & (testUser != null))
                                        {
                                            //alors l'utilisateur se connecte
                                            System.Web.Security.FormsAuthentication.SetAuthCookie(testUser.id.ToString(), false);
                                        }
            
                                        return Boolauthentification;
                                    }
                                    else
                                    {
                                        Boolauthentification = false;
                                    }
                                
                            }
            
                            if (Boolauthentification == false)
                            {
            
                            }
                        }
                        catch (Exception ex)
                        {
                            //erreur 
                            Console.WriteLine(ex.Message);
            
            
                            System.Diagnostics.StackFrame sf = new System.Diagnostics.StackFrame();
                            string methodName = this.GetType().Name + "_" + sf.GetMethod().Name;
                        }
                        Boolauthentification = false;
                        return Boolauthentification;
                    }

            merci !! 

            • Partager sur Facebook
            • Partager sur Twitter

            Authentification web.config avec Active Directory

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown