2017-09-08 11 views
0

Je tente d'authentifier les utilisateurs de mon entreprise pour les applications Symfony3 à l'aide d'Active Directory. Ma configuration actuelle est la suivante (ceci a également été testé avec succès avec un serveur de test LDAP en ligne, donc je peux confirmer que la configuration de Symfony est correcte).Connexion/liaison à Active Directory (Windows) à l'aide de LDAP dans Symfony 3 sans utiliser de chaîne dn

//services.yml 

Symfony\Component\Ldap\Ldap: 
     arguments: ['@Symfony\Component\Ldap\Adapter\ExtLdap\Adapter'] 
    Symfony\Component\Ldap\Adapter\ExtLdap\Adapter: 
     arguments: 
      - host: host.dom1.dom2.net 
       port: 389 
       encryption: none 
       options: 
        protocol_version: 3 
        referrals: false 
//security.yml 

my_ldap: 
     ldap: 
     service: Symfony\Component\Ldap\Ldap 
     base_dn: dc=dom1,dc=dom2,dc=net 
     search_dn: "cn=myUsername,dc=dom1,dc=dom2,dc=net" 
     search_password: myPassword 
     default_roles: ROLE_ADMIN 
     uid_key: sAMAccountName 

.... 
firewalls: 
     form_login_ldap: 
     provider: my_ldap 
     service: Symfony\Component\Ldap\Ldap 
     dn_string: 'sAMAccountName={username},dc=dom1,dc=dom2,dc=net' 
     login_path: login 
     check_path: login 
     default_target_path: /index 

Lorsque je tente de se connecter, j'obtiendrai refusé sur la base « des informations d'identification non valides » alors que je suis sûr que mes lettres de créance sont entrés correctement. J'espère que le problème principal ici est que le "search_dn" & "search_password" est le mien, et je n'ai pas les droits d'administrateur dans notre AD. Il apparaît (selon la documentation de Symfony) que ces creds doivent être ceux d'un administrateur AD. J'attends cette information de mon administrateur, mais il a fallu remonter la chaîne, cela peut prendre un certain temps. J'ai essayé de les remplacer par des zéros, ce qui provoque une erreur différente.

Ma question arrive à ce moment que je réellement suis en mesure d'établir une connexion réussie & liaison avec notre AD en utilisant seul PHP avec le code suivant:

//ldapconnect.php 

$ldap = ldap_connect("host.dom1.dom2.net"); 

if (ldap_bind($ldap, "[email protected]", "myPassword")) { 
    echo "login successful"; 
} else { 
    echo "Incorrect Login"; 
} 

Fondamentalement, je suis à la recherche pour voir si je peux réplique d'une manière ou d'une autre le code de liaut PHP ldap autonome ci-dessus dans mon projet Symfony (il semble que la chaîne dn requise dans Symfony cause le problème). Je suis assez nouveau à ce sujet donc je ne comprends pas pourquoi le code PHP autonome permet la liaison LDAP tout en utilisant la chaîne dn ne pas (autre que notre AD est probablement bloquer la requête lorsque dn chaîne utilisée).

Merci d'avance pour toute aide.

Edit: mis à jour avec lecture seule-admin information recherche dn:

//security.yml 

my_ldap: 
     ldap: 
     service: Symfony\Component\Ldap\Ldap 
     base_dn: 'CN=Users,dc=dom1,dc=dom2,dc=net' 
     search_dn: "cn=ReadOnlyAdmin,OU=ou1,OU=ou2,dc=dom1,dc=dom2,dc=net" 
     search_password: adminPass 
     default_roles: ROLE_USER 
     uid_key: sAMAccountName 
.... 
firewalls: 
     http_basic_ldap: 
     provider: my_ldap 
     service: Symfony\Component\Ldap\Ldap 
     dn_string: 'DOMAIN\{username}' 

Il semble que je suis au moins capable de se lier au serveur ldap maintenant, mais je suis toujours des titres de compétences non valides avec « utilisateur introuvable » erreur:

//dev.log 

[2017-09-11 13:10:15] request.INFO: Matched route "app_default_admin". {"route":"app_default_admin","route_parameters":{"_controller":"AppBundle\\Controller\\DefaultController::adminAction","_route":"app_default_admin"},"request_uri":"http://localhost:8000/index","method":"GET"} [] 
[2017-09-11 13:10:15] security.INFO: Basic authentication Authorization header found for user. {"username":"myUsername"} [] 
[2017-09-11 13:10:15] security.INFO: Basic authentication failed for user. {"username":"myUsername","exception":"[object] (Symfony\\Component\\Security\\Core\\Exception\\BadCredentialsException(code: 0): Bad credentials. at C:\\pathtoSymfonyProject\\vendor\\symfony\\symfony\\src\\Symfony\\Component\\Security\\Core\\Authentication\\Provider\\UserAuthenticationProvider.php:73, Symfony\\Component\\Security\\Core\\Exception\\UsernameNotFoundException(code: 0): User \"myUsername\" not found. at C:\\pathtoSymfonyProject\\vendor\\symfony\\symfony\\src\\Symfony\\Component\\Security\\Core\\User\\LdapUserProvider.php:82)"} [] 

Je me demande aussi ce « \ user » myusername \ « introuvable » erreur vers la fin de la troisième ligne, est-il à la recherche AD pour nom d'utilisateur « myusername \ » et ajouter une barre oblique inverse? Cela pourrait juste être le format du code d'erreur car il semble être correct dans la deuxième ligne et le début de la troisième ligne.

Edit 2:

J'ai finalement eu la connexion de travail, la configuration correcte est la suivante:

//security.yml 

my_ldap: 
     ldap: 
     service: Symfony\Component\Ldap\Ldap 
     base_dn: 'dc=dom1,dc=dom2,dc=net' 
     search_dn: "cn=ReadOnlyAdmin,OU=ou1,OU=ou2,dc=dom1,dc=dom2,dc=net" 
     search_password: 'adminPass' 
     default_roles: ROLE_USER 
     uid_key: sAMAccountName 
.... 
firewalls: 
     http_basic_ldap: 
     provider: my_ldap 
     service: Symfony\Component\Ldap\Ldap 
     dn_string: 'MYDOMAIN\{username}' 

De mon édition précédente, tout ce que je devais faire était enlever « CN = Utilisateurs "du base_dn car les comptes d'utilisateurs ne se trouvaient pas réellement là, en supprimant cela et en laissant juste les composants de domaine a permis à notre AD entière d'être recherchée pour l'utilisateur. Une autre remarque importante est que le dn_string doit être configuré comme 'MYDOMAIN \ {nom d'utilisateur}' ou l'authentification ne passera pas (par réponse d'Alvin Bunk). Comme Alvin le souligne dans son article ci-dessous, cette partie n'est malheureusement pas mentionnée dans la documentation de Symfony LDAP.

Répondre

0

Jetez un oeil à mon article récent sur ce point:

https://alvinbunk.wordpress.com/2017/09/07/symfony-ldap-component-ad-authentication/

Je vous soupçonne avez juste besoin de changer votre dn_string comme ceci:

dn_string: 'DOMAIN\{username}' 

S'il vous plaît lire mon article. Essayez aussi:

default_roles: ROLE_USER 

Vous pouvez également essayer d'utiliser http_basic_ldap selon mon article et vérifiez le journal de dev. C'est probablement quelque chose de simple - n'abandonnez pas!

+0

Salut Alvin, merci pour la réponse rapide. J'ai mis à jour ma configuration pour refléter votre suggestion avec ce qui est posté dans votre article. J'ai également depuis reçu le compte en lecture seule-admin pour notre AD. J'ai mis à jour mon message pour montrer la nouvelle configuration avec le message du journal des erreurs. Il semble que je suis maintenant capable de me lier au serveur ldap, mais je reçois toujours une erreur 'bad credentials'/'user not found' (le journal des erreurs est également visible dans edit). – TomShelby

+0

Est-ce que "DOMAIN" est le domaine Windows correct? J'en doute? Je l'ai donné comme exemple ... Le message d'erreur montre juste des citations autour de 'myUsername', ce qui est correct. Avec le navigateur LDAP, avez-vous recherché 'myUsername' sous la baseDN' CN = Users, dc = dom1, dc = dom2, dc = net'. L'utilisateur 'myUsername' doit également exister ici. Je pense que vous l'avez presque réussi! –

+0

Vous pouvez également essayer [Explorateur Active Directory] (https://docs.microsoft.com/en-us/sysinternals/downloads/adexplorer) et essayez avec votre compte en lecture seule, puis développez 'CN = Configuration, DC = dom1, DC = dom2, DC = net' et sous cela développez 'CN = Partitions'. Vous devriez avoir un domaine Windows à utiliser sous cela. Il aura une valeur 'nETBIOSName'. –