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

API, COM et SDKs Delphi Discussion :

Authentification sur un serveur LDAP


Sujet :

API, COM et SDKs Delphi

  1. #1
    Membre expert
    Avatar de aityahia
    Homme Profil pro
    CIEPTAL CARS SPA
    Inscrit en
    Mars 2006
    Messages
    1 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Algérie

    Informations professionnelles :
    Activité : CIEPTAL CARS SPA
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 938
    Points : 3 329
    Points
    3 329
    Par défaut Authentification sur un serveur LDAP

    j'ai créé une application ou des utilisateurs doivent s'authentifier on utilisant leurs login Active Directory (LDAP).
    j'arrive a faire ça en utilisant la Commande ADsOpenObject mais je sent que c'est pas la meilleur solution.

    Déclaration
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      function ADsOpenObject(lpszPathName: PWideChar;
      lpszUserName: PWideChar; lpszPassword: PWideChar;
      dwReserved: LongInt; const riid: TGUID; out obj): HResult;
       stdcall; external 'activeds.dll';
    Appel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Hr := ADSOpenObject('LDAP://cieptalcars',Edit1.Text,Edit2.Text,ADS_SECURE_AUTHENTICATION,IID_IADs,Outt);
    if hr = S_OK then
     ShowMessage('Connection Avec succées')
     else
      ShowMessage(IntToStr(Hr));
    j'ai le résultat souhaité mais je pense que cette commande fait plus qu'une authentification cars c'est un peut long et Vu le Open ADSOpenObject

    existe t'il une autres solution j'ai cherché et je suis tombé sur des commandes API
    que je n'est pas encore su encore les utilisés (NetAccessCheck)

    si quelqu'un peut m'aider sa serais appréciable.
    NB : Je trouve le support msdn un peut pauvre (manque d'exemple d'utilisation)

  2. #2
    Membre expert
    Avatar de aityahia
    Homme Profil pro
    CIEPTAL CARS SPA
    Inscrit en
    Mars 2006
    Messages
    1 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Algérie

    Informations professionnelles :
    Activité : CIEPTAL CARS SPA
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 938
    Points : 3 329
    Points
    3 329
    Par défaut
    j'ai omis de dire qu'il faut :
    • Transtypé les variables text en PWideChar
    • est de déclarer outt comme Pointer.
    • déclarer l'unités ActiveDs_TLB que vous devrais préalablement importé

    pour que le transtypage réussit on doit passer par des variable WideString pour que celui-ci ne soit pas ambigu.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    procedure TForm1.Button1Click(Sender: TObject);
    var  Hr : HResult;
         outt :Pointer;
         Username,Password : WideString;
    begin
     Username :=Edit1.Text;
     PassWord:= Edit2.Text;
    Hr := ADSOpenObject('LDAP://cieptalcars',PWideChar(Username),PWideChar(Password),ADS_SECURE_AUTHENTICATION,IID_IADs,Outt);
    if hr = S_OK then
     ShowMessage('Connection Avec succées')
     else
      ShowMessage(IntToStr(Hr));
    end;

  3. #3
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 616
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 616
    Points : 25 311
    Points
    25 311
    Par défaut
    Dans le Titre, tu devrais ajouter "LDAP MicroSoft", car ADSI contenu dans activeds.dll, ne fonctionne qu'avec Active Directory si j'ai bien compris, je suis justement, en plein dedans, je dois utiliser un LDAP sur un Linux, j'ai voulu tenter ADO (avant d'essayer des API spécifiques, voire resteindre à MicroSoft) Pour le moment, avec ADO ça ne passe pas car je n'ai pas trouver le Provider a renseigner (Driver a installer ???)

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 616
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 616
    Points : 25 311
    Points
    25 311
    Par défaut
    J'ai tenté d'utiliser les API que tu indique aityahia (bon j'ai mis tous les paramètres en dur pour le moment)

    J'ai le code erreur "8007001F" et selon la MSDN cela donne LDAP_OTHER, ERROR_GEN_FAILURE = "Unknown error".

    J'aurais préféré une erreur comme quoi mon serveur n'est pas actif (j'ai pris le serveur de domaine car d'après ce que j'ai pu voir, cela contient l'ensemble des users dans Active Directory), j'ai donc essayé de me connecter avec mon login et mot de passe, mais cela ne passe pas (évidemment, je n'ai pas le pass de l'admin, sinon ça serait trop facile)

    EDIT : en Appelant ADsGetObject au lieu de ADSOpenObject, j'ai "80072030" = "Object does not exist.", bon, donc ma cible est bonne ce sont mes dc et cn qui sont foireux (et personne n'y connait quelque chose au bureau)

    EDIT 2 : Lol j'ai testé ADsGetObject sur mon LDAP sur le Linux, cela se connecte ! mais ADSOpenObject échoue !

  5. #5
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 457
    Points
    28 457
    Par défaut
    Hello,

    je viens de mettre en ligne un code LDAP natif Delphi

    http://lookinside.free.fr/delphi.php?LDAP

  6. #6
    Membre expert
    Avatar de aityahia
    Homme Profil pro
    CIEPTAL CARS SPA
    Inscrit en
    Mars 2006
    Messages
    1 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Algérie

    Informations professionnelles :
    Activité : CIEPTAL CARS SPA
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 938
    Points : 3 329
    Points
    3 329
    Par défaut
    Salut shai.
    c'est vrai que j'ai pas testé avec un serveur Linux meme avec IPlanet, d'ailleur je m'apprete a déployer mon application chez un client je sais meme pas quel type de serveur il utilise.
    je vais faire des recherche et je vous tiendrais au courant.

    @

  7. #7
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 616
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 616
    Points : 25 311
    Points
    25 311
    Par défaut
    Bon, par ADO, j'ai beau bidouillé dans tous les sans la connectionstring et le SQL (dont en fait j'ignore la syntaxe pour LDAP)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Provider=ADsDSOObject;Password=ahah;User ID=shai;Encrypt Password=False;Data Source=192.168.1.1;Location="dc=toto,dc=tata";Mode=Read;Bind Flags=0;ADSI Flag=-2147483648
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT AdsPath, CN, SN FROM "LDAP://dc=toto,dc=tata"
    ce ne passe pas du tout

    mais par l'API, cela fonctionne sans mettre ADS_SECURE_AUTHENTICATION

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       Hr :=  ADSOpenObject('LDAP://192.168.1.1/dc=toto,dc=tata', 'cn=shai,ou=contacts,dc=toto,dc=tata', 'ahah', 0, IID_IADs, Outt);  // fonctionne sur Linux !
    Comment sur Active Directory, connait ton le nom distingué LDAP d'un item ?


    @Paul Toth, tu es une vraie brute, ton code est super court pour LDAD, je le testerais aussi dès que j'aurais du temps ...

  8. #8
    Membre expert
    Avatar de aityahia
    Homme Profil pro
    CIEPTAL CARS SPA
    Inscrit en
    Mars 2006
    Messages
    1 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Algérie

    Informations professionnelles :
    Activité : CIEPTAL CARS SPA
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 938
    Points : 3 329
    Points
    3 329
    Par défaut
    je crois que c'est sAMAccountName

  9. #9
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 457
    Points
    28 457
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    @Paul Toth, tu es une vraie brute, ton code est super court pour LDAD, je le testerais aussi dès que j'aurais du temps ...
    LOL, attention, le code reprend uniquement ce dont j'avais besoin pour authentifier des individus puis les identifier.

    notamment LDAPSearch fait en dur une recherche sur des attributs précis de LDAP...mais je pense que le code est suffisamment simple à comprendre pour l'enrichir si nécessaire...faut juste un peu de doc sur LDAP parce que c'est pas immédiat de comprendre ça :
    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
     
     s1:=Chunk(LDAP_SEQUENCE, // SEQUENCE
      Chunk(LDAP_INTEGER,#2)+      // Message ID 2
      Chunk(LDAP_SEARCH,     // Search
       Chunk(LDAP_STRING,'')+ // BaseObject
       Chunk(LDAP_ENUM,#2)+ // Scope 2 = Whole Tree
       Chunk(LDAP_ENUM,#0)+ // Aliases 0 = derefaliases
       Chunk(LDAP_INTEGER,#0)+ // Size limite
       Chunk(LDAP_INTEGER,#0)+ // Time limite
       Chunk(LDAP_BOOLEAN,LDAP_FALSE)+ // Type only (boolean)
       Chunk(LDAP_FILTER_OR, // Filter = OR
        Chunk(LDAP_FILTER_MATCH, // Filter = Equality Match
         Chunk(LDAP_STRING,'cn')+ // common name
         Chunk(LDAP_STRING,Name)
        )+
        Chunk(LDAP_FILTER_MATCH, // Filter = Equality Match
         Chunk(LDAP_STRING,'uid')+ // unique id
         Chunk(LDAP_STRING,Name)
        )
       )+
       Chunk(LDAP_SEQUENCE,
        Chunk(LDAP_NULL,'') // NULL
       )
      )
     );

  10. #10
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 616
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 616
    Points : 25 311
    Points
    25 311
    Par défaut
    Pour le moment,
    ADO = Rien ne passe, ni Windows, ni Linux, je n'ai pas réussi à faire de SQL dessus, cela me mets toujours une erreur ADO à la con "Une ou plusieurs Erreurs sont survenus durant ..."

    API = Identification sur Linux (avec nom distingué cela fonctionne), avec Windows (AD), n'ayant pas trouvé les noms distingués, je pense que c'est le problème

    Donc, vu que pour le moment, on ne doit que juste savoir si le user existe sur le LDAP c'est bon, d'ailleurs LDAP c'est le protocole, comment s'appelle le gestionnaire par lui même ?

  11. #11
    Membre expert
    Avatar de aityahia
    Homme Profil pro
    CIEPTAL CARS SPA
    Inscrit en
    Mars 2006
    Messages
    1 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Algérie

    Informations professionnelles :
    Activité : CIEPTAL CARS SPA
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 938
    Points : 3 329
    Points
    3 329
    Par défaut
    pour moi avec ADO sa marche impec j'arrive a récupérer toutes les information que je veu avec une requette select.

    j'ai copié directement ce code de mon application.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     AdsPath :=Sd.RegFile.ReadString('NetConfig','AdsPath','LDAP://DC=Cieptalcars,DC=local,DC=com');
       sd.Ldap.Close;
       sd.Ldap.SQL.Clear;
       sd.Ldap.SQL.Add('SELECT AdsPath, CN, SN,mail,userPrincipalName,sAMAccountName,Title,company,department FROM '+QuotedStr(AdsPath)+' WHERE LdapsAMAccountName =  '+QuotedStr(EKeyWord.Text)+' or  givenName = '+QuotedStr(EKeyWord.Text)+' or sn='+QuotedStr(EKeyWord.Text)+'  ORDER BY sn');
       sd.Ldap.Open;
    soit mon domaine est cieptalcars.local.com.
    et pour la connection string.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Provider=ADsDSOObject;Encrypt Password=False;Mode=Read;Bind Flags=0;ADSI Flag=-2147483648
    j'ai pas essayé avec les réseaux sécurisés avec des certificats.

  12. #12
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 676
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 676
    Points : 7 081
    Points
    7 081
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    Hello,

    je viens de mettre en ligne un code LDAP natif Delphi

    http://lookinside.free.fr/delphi.php?LDAP
    J'ai essayé, mais la fonction LDAPSearch ne trouve jamais rien. (http://www.developpez.net/forums/sho...d.php?t=452824)




    Sinon, ADO ne trouve rien (dans une DLL).

  13. #13
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 457
    Points
    28 457
    Par défaut
    il faudrait connaitre la schéma de ton annuaire LDAP

    je vois que tu envoies ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    'where LdapsAMAccountName = ' + QuotedStr(szLogin)+' or givenName = ' + QuotedStr(szLogin) + ' or sn = ' + QuotedStr(szLogin)
    or ma function LDAPSearch cherche sur "uid" et "cn"

    j'utilise ces deux zones qui me permettent sur mon annuaire LDAP Notes de m'authentifier aussi bien avec mon nom complet (cn) qu'avec un de mes alias de mail (uid).

    Si tu utilises l'un ou l'autre dans LDAPSearch, il devrait retrouver ton DN, ou alors tu peux modifier les attributs dans la requête :
    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
     
     s1:=Chunk(LDAP_SEQUENCE, // SEQUENCE
      Chunk(LDAP_INTEGER,#2)+      // Message ID 2
      Chunk(LDAP_SEARCH,     // Search
       Chunk(LDAP_STRING,'')+ // BaseObject
       Chunk(LDAP_ENUM,#2)+ // Scope 2 = Whole Tree
       Chunk(LDAP_ENUM,#0)+ // Aliases 0 = derefaliases
       Chunk(LDAP_INTEGER,#0)+ // Size limite
       Chunk(LDAP_INTEGER,#0)+ // Time limite
       Chunk(LDAP_BOOLEAN,LDAP_FALSE)+ // Type only (boolean)
       Chunk(LDAP_FILTER_OR, // Filter = OR
        Chunk(LDAP_FILTER_MATCH, // Filter = Equality Match
         Chunk(LDAP_STRING,'givenName ')+ 
         Chunk(LDAP_STRING,Name)
        )+
        Chunk(LDAP_FILTER_MATCH, // Filter = Equality Match
         Chunk(LDAP_STRING,'sn')+ 
         Chunk(LDAP_STRING,Name)
        )
       )+
       Chunk(LDAP_SEQUENCE,
        Chunk(LDAP_NULL,'') // NULL
       )
      )
     );
    ça fait un peu longtemps que j'ai fait ça et je ne sais plus comment ajouter un troisième attribut...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     Chunk(LDAP_FILTER_OR,r1+r2+r3);
    // ou
     Chunk(LDAP_FILTER_OR,Chunk(LDAP_FILTER_OR,r1+r2)+r3);
    // avec r1 r2 et r3 des Chunk(LDAP_FILTER_MATCH,...
    Il faudrait que je regarde demain au bureau, j'ai écris un outils d'interrogation LDAP

Discussions similaires

  1. authentification sur un serveur
    Par judy-brainy dans le forum API standards et tierces
    Réponses: 1
    Dernier message: 07/10/2011, 09h04
  2. Réponses: 8
    Dernier message: 15/04/2009, 14h21
  3. question sur couplage serveurs ldap,web,dns
    Par tenderstoune dans le forum Réseau
    Réponses: 2
    Dernier message: 29/02/2008, 15h07
  4. [WinCVS] problème d'authentification sur un serveur CVS distant
    Par lin_connu dans le forum CVS
    Réponses: 0
    Dernier message: 28/01/2008, 14h58
  5. Authentification via un serveur LDAP
    Par jh0483 dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 16/01/2006, 06h53

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