2010-10-25 19 views
1

J'essaye d'écrire un script Ruby qui vérifie si les informations d'identification de l'utilisateur sont valides en utilisant un serveur d'annuaire actif. Voici ce que j'ai essayé jusqu'à présent:Comment vérifier les informations d'identification de l'utilisateur à l'aide du répertoire actif et d'un script ruby ​​

require 'rubygems' 
require 'net-ldap' 

host = '10.4.1.6' 
port = 389 

username = 'username' 
password = 'password' 

ldap = Net::LDAP.new 
ldap.host = host 
ldap.port = port 
ldap.auth "CN=#{username},CN=Users,DC=companyname,DC=ad", password 

if ldap.bind 
    puts 'YES!' 
    puts ldap.get_operation_result.message 
else 
    puts 'NO :-(' 
    puts ldap.get_operation_result.message 
end 

Si j'entre un nom d'utilisateur non existant et une chaîne vide comme un mot de passe, l'opération de liaison réussit. Si j'entre un nom d'utilisateur valide et un mot de passe valide/invalide/vide, l'opération de liaison échoue avec le message d'erreur 'Credentials invalides'.

J'ai regardé d'autres threads et lu la documentation de net-ldap mais je ne peux pas comprendre ce que je fais mal.

Quelqu'un peut-il me donner quelques idées sur la façon d'y parvenir?

Merci à l'avance pour toute réponse :-)

Edit:

Comme suggéré @StuartEllis, le problème était avec l'identifiant de l'utilisateur. Pour trouver le bon DN, je le script suivant (extrait de la documentation net-ldap):

ldap.auth "CN='adminUser',CN=Users,DC=companyname,DC=ad", 'adminUserPwd' 
ldap.bind 
treebase = "DC=companyname,DC=ad" 
filter = Net::LDAP::Filter.eq("mail", "[email protected]") 
attrs = ["mail", "cn", "sn","objectclass"] 
ldap.search(:base => treebase, :filter => filter, :attributes => attrs, :return_result => false) do |entry| 
    puts entry._dump 0 
end 

je puis rejugé en utilisant mon script original (ci-dessus) avec le DN obtenu et le tour est joué!

Répondre

2

Je suppose que les détails de votre compte LDAP ne sont pas corrects, mais votre serveur LDAP accepte les liens anonymes, c'est pourquoi cela fonctionne lorsque vous ne spécifiez pas un nom d'utilisateur et un mot de passe valides. Les identifiants d'utilisateur LDAP sont très fastidieux, donc je suggère de revérifier le tout, y compris le cas des pièces.

1

est un exemple de code Ici, je l'utilise avec la gemme net-ldap pour vérifier les connexions des utilisateurs du serveur ActiveDirectory à mon travail:

def name_for_login(email, password) 
    email = email[/\A\w+/].downcase # Throw out the domain, if it was there 
    email << "@mycompany.com"  # I only check people in my company 
    ldap = Net::LDAP.new(
    host: 'ldap.mycompany.com', # Thankfully this is a standard name 
    auth: { method: :simple, email: email, password:password } 
) 
    if ldap.bind 
    # Yay, the login credentials were valid! 
    # Get the user's full name and return it 
    ldap.search(
     base:   "OU=Users,OU=Accounts,DC=mycompany,DC=com", 
     filter:  Net::LDAP::Filter.eq("mail", email), 
     attributes: %w[ displayName ], 
     return_result:true 
    ).first.displayName.first 
    end 
end