IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

ASP.NET Discussion :

[C#][Active Directory]Authentification via LDAP


Sujet :

ASP.NET

  1. #1
    Membre confirmé Avatar de apoingsfermes
    Profil pro
    Inscrit en
    Février 2006
    Messages
    54
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2006
    Messages : 54
    Par défaut [C#][Active Directory]Authentification via LDAP
    Bonjour,

    J'écris une interface web qui doit permettre de changer le mot de passe de l'utilisateur dans Active Directory, même si ce mot de passe est périmé depuis quelques temps.
    Je ne peux donc pas utiliser l'authentification via IIS, qui ne permettrait pas la connection avec un mot de passe périmé. je me connecte donc directement à Active Directory via une requête LDAP.

    Je tombe sur l'erreur typique : "Le domaine spécifié n'existe pas ou n'a pas pu être contacté.", quand j'appelle la fonction suivante, qui verifie que l'utilisateur qui a rentré son login/mdp existe dans AD :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    public bool IsAuthenticated(string LDAPPATH, string login, string pwd) {
     
                DirectoryEntry Entry = null;
                DirectorySearcher Search1 = null;
                Error = "";
     
                try {
                    DirectoryEntry Entry Entry = new DirectoryEntry(LDAPPATH, login, pwd);
                    Entry.AuthenticationType = AuthenticationTypes.None;
                    Search1 = new DirectorySearcher(Entry);
                    Search1.SearchScope = SearchScope.Subtree;
                    Search1.CacheResults = false;
                    Search1.Filter = "(&(objectClass=user)(mail=" + login + "))";
                    Search1.PropertiesToLoad.Add("mail");
     
                    SearchResult result = Search1.FindOne();  // exception levée à cette ligne
                    if (result == null) {
                        Error = "Utilisateur pas trouvé dans AD !!";
                        return false;
                    }
     
                } catch (Exception ex) {
                    Error = ex.Message + "; <pre>" + ex.StackTrace + "</pre>";
                    return false;
                }
                return true;
            }
    Je précise que le LDAPPATH utilisé est valide (un programme en C# avec la même fonction marche sans problèmes.

    Dans mon fichier web.config, j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        <authentication mode="None"/>
        <identity impersonate="true" />
    et dans les propriétés de mon site web, j'ai activé la connexion anonyme, laissé le nom d'utilisateur par défaut avec son mot de passe, autorisé la vérification de mot de passe par IIS, et désactivé l'authentification intégrée Windows.
    Je crois que le problème vient de ces derniers réglages.
    La gestion de l'authentification n'est pas très claire dans mon cas : je ne veux pas que IIS gère l'authentification, mais la page ASP.NET doit avoir assez de droits pour que chaque utilisateur puisse modifier son mot de passe.
    Je me demande, entre autres, si je dois utiliser l'impersonnification.

    Merci pour vos conseils/éclaircissements

  2. #2
    Membre averti
    Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 17
    Par défaut
    Et avec un utilisateur non périmé ca passe ?
    Et lorsque tu debug en local et non ton serveur de prod ca marche ?

  3. #3
    Membre confirmé Avatar de apoingsfermes
    Profil pro
    Inscrit en
    Février 2006
    Messages
    54
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2006
    Messages : 54
    Par défaut
    Pour le moment je n'ai testé qu'avec des utilisateurs "non périmés", et sur le serveur local.

    En fait j'ai fait une manip douteuse : j'ai changé le compte utilisé pour les connexions anonymes dans le dossier "sécurité de répertoire" des propriétés de mon projet web, pour un utilisateur avec des droits suffisants pour lire et écrire dans Active Directory.
    Puis pour des raisons administratives j'ai du remettre le compte par défaut (IUSR_NOM_DU_PC), mais sans qu'il me demande le mot de passe.

    D'ailleurs je ne peux pas lancer le débugage directement dans Visual Studio parce que "integrated Windows authentication is not enabled". Du coup je teste en tapant directement l'URL dans un navigateur. (http://localhost/MonProjet/Login.aspx)

  4. #4
    Membre confirmé Avatar de Sodangbe
    Développeur informatique
    Inscrit en
    Janvier 2006
    Messages
    171
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 171
    Par défaut
    Oui ce que tu as oublié certainement c'est que dans un domaine où tourne un service d'annuaire les modification n peuvent s'effectuer qu'avec des membres de domaines possédant des droits d'adminitrateur.

    J'ai bosser sur un projet similaire il y a trois mois où je devait créer une pplication mobile web pour permettre a des utilisateurs de telephones ortable de modifié leur mot de passe Active directory.

    J' autorise d'abord un accès avec un compte administrateur et ensuite une authantifiction propre des utilisateur.sans cela tu ne peux jamais accéder au domaine.

    Si ca peut t'aider voici mon code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    using System;
    using System.Collections;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Web;
    using System.Web.Mobile;
    using System.Web.SessionState;
    using System.Web.UI;
    using System.Web.UI.MobileControls;
    using System.Web.UI.WebControls;
    using System.Web.UI.HtmlControls;
    using System.DirectoryServices;
    using System.DirectoryServices.ActiveDirectory;
    using System.DirectoryServices.Protocols;
     
     
    public partial class _Default : System.Web.UI.MobileControls.MobilePage
    {
        protected void Page_Load(object sender, EventArgs e)
        {
     
        }
        protected void Command1_Click(object sender, EventArgs e)
        {
     
                if (RequiredFieldValidator1.IsValid && RequiredFieldValidator2.IsValid)
                {
                    try
                    {
     
                        // Connexion à l'annuaire
                        DirectoryEntry Ldap = new DirectoryEntry("LDAP://nomdemondomaine", TextBox1.Text, TextBox2.Text);
     
                        // Nouvel objet pour instancier la recherche
                        DirectorySearcher searcher = new DirectorySearcher(Ldap);
     
                        // On modifie le filtre pour ne chercher que l'user dont le nom de login est dans textbox1
                        searcher.Filter = "(SAMAccountName=" + TextBox1.Text + ")";
     
                        // Pas de boucle foreach car on ne cherche qu'un user
                        SearchResult result = searcher.FindOne();
     
     
                        // On récupère l'objet trouvé lors de la recherche
                        DirectoryEntry DirEntry = result.GetDirectoryEntry();
     
                        this.ActiveForm = Form2;
     
                       Label7.Text = (string)DirEntry.Properties["givenName"].Value + " " + (string)DirEntry.Properties["sn"].Value;
                    }
                    catch (Exception ex)
                    {
                       RequiredFieldValidator2.IsValid = false;
                       RequiredFieldValidator2.ErrorMessage = "Echec d'ouverture de session";
     
     
                    }
                }
     
        }
     
        protected void Command2_Click(object sender, EventArgs e)
        {   
            if(CompareValidator2.IsValid && CustomValidator1.IsValid && RequiredFieldValidator3.IsValid && CustomValidator2.IsValid)
             {
                 try
                 {
                     //Liaison à l’utilisateur administrateur membre du domaine 
     
                     DirectoryEntry entry = new DirectoryEntry("LDAP://mondomaine", "loginadministrateur", "motdepasseadministrateur");
     
                     // Nouvel objet pour instancier la recherche
                     DirectorySearcher searcher = new DirectorySearcher(entry);
     
                     // On modifie le filtre pour ne chercher que l'user dont le nom de login est dans textbox1
                     searcher.Filter = "(SAMAccountName=" + TextBox1.Text + ")";
     
                     // Pas de boucle foreach car on ne cherche qu'un user
                     SearchResult result = searcher.FindOne();
     
                     // On récupère l'objet trouvé lors de la recherche
                     DirectoryEntry DirEntry = result.GetDirectoryEntry();
     
                     //Modification du mot de passe de l’utilisateur 
     
                     DirEntry.Invoke("SetPassword", new object[] { TextBox5.Text });
     
                     //Destruction des objets 
                     entry.Dispose();
                     this.ActiveForm = Form4;
                 }
                 catch (Exception ex)
                 {
                     CompareValidator2.IsValid = false;
                     CompareValidator2.ErrorMessage = "Votre mot de passe n'a pas pu etre changé";
     
                 }
            }
        }
     
        protected void CustomValidator1_ServerValidate(object source, ServerValidateEventArgs args)
        {
            args.IsValid = (TextBox3.Text == TextBox2.Text);
     
        }
        protected void Command3_Click(object sender, EventArgs e)
        {
            this.ActiveForm = Form3;
        }
        protected void List1_ItemCommand(object sender, ListCommandEventArgs e)
        {
     
        }
        protected void CustomValidator2_ServerValidate(object source, ServerValidateEventArgs args)
        {
            args.IsValid = (TextBox4.Text.Length > 2);
        }
    }


    La premiere méthode permet d'authentifier l'user sans l'authorisation de l'administrateur ca c'est bien normale .La deuxieme méthode permet de changer le mot de passe et sans une entrée administrateur c'est perdu d'avance.

    attention!!! dans mon code j'ai utiliser des validator pour securiser l'accès tu peux bien t'en passer

  5. #5
    Membre confirmé Avatar de apoingsfermes
    Profil pro
    Inscrit en
    Février 2006
    Messages
    54
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2006
    Messages : 54
    Par défaut
    Rien n'y fait, j'ai toujours la même erreur :
    "Le domaine spécifié n'existe pas ou n'a pas pu être contacté".

    Mon code fait exactement la même chose que celui de Sodangbe.
    Je l'ai testé dans un script local en C# : j'arrive a identifier mes utilisateurs.
    Je crois vraiment que le problème vient de la configuration de mon appli web.
    Dans mon web.config, j'ai donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        <authentication mode="None"/>
        <identity impersonate="true"/>
    et dans IIS mon site est réglé de la façon montrée dans le screenshot joint.

    je ne comprends plus ! Le pire, c'est que j'ai réussi à faire marcher l'appli web, jusqu'à ce que mon chef change un truc dans la config...
    Images attachées Images attachées  

  6. #6
    Membre confirmé Avatar de Sodangbe
    Développeur informatique
    Inscrit en
    Janvier 2006
    Messages
    171
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 171
    Par défaut
    je ne comprends plus ! Le pire, c'est que j'ai réussi à faire marcher l'appli web, jusqu'à ce que mon chef change un truc dans la config...
    c'est vraiment pas de bol pour toi!!!!! mais pour info dans mon web.config j'ai un mode authentification "Windows" .

  7. #7
    Membre confirmé Avatar de apoingsfermes
    Profil pro
    Inscrit en
    Février 2006
    Messages
    54
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2006
    Messages : 54
    Par défaut
    Bon, ça marche maintenant.
    J'ai supprimé l'impersonnation, mis le mode authentication à "Windows", et surtout j'ai ajouté explicitement le nom du serveur LDAP dans la requête.
    Pour une raison inconnue, il n'était plus capable de trouver le serveur par défaut.

    merci à vous

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    801
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 801
    Par défaut
    Bonjour,
    Je crois que tu peux laisser l'impersonation.

    Il te faut configurer IIS en autorisant le mode d'authentification windows.
    Dans l'impersonation, tu dois spécififer un user et mot de passe valide:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    <identity impersonate="true" userName="Domain\user_admin" password="pass"/>
    Ainsi lorsque l'utilisateur se connecte à l'appli et s'il est authentifié, il utilisera le userName DOmain/user_admin.

    Si tu ne spécifie pas d'impersonation, c'est le user connecté qui sera utilisé.
    SI tu enlèves l'authentification windoows, c'est le user ASP.net qui sera utilisé.

    Un lien qui pourrait t'interesser:

    Authentification .NET

    Bon week end !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Active Directory et son LDAP : identifiants de connexion
    Par C-Jay dans le forum Windows Serveur
    Réponses: 3
    Dernier message: 28/04/2010, 22h06
  2. Authentification via LDAP
    Par Aguado dans le forum ASP
    Réponses: 9
    Dernier message: 07/05/2009, 15h56
  3. [auth-method] Authentification via ldap
    Par heid dans le forum Weblogic
    Réponses: 3
    Dernier message: 25/04/2008, 14h00
  4. Authentif. via LDAP : pb sur roles
    Par marinew dans le forum Tomcat et TomEE
    Réponses: 1
    Dernier message: 23/01/2008, 13h50
  5. [JNDI] Interrogation Active Directory 2003 via jndi
    Par xplicit95 dans le forum API standards et tierces
    Réponses: 2
    Dernier message: 13/07/2007, 10h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo