Как проверить учетные данные пользователя, используя активный каталог и скрипт ruby - PullRequest
1 голос
/ 26 октября 2010

Я пытаюсь написать скрипт на 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

Если я введу несуществующее имя пользователя и пустую строку в качестве пароля, операция связывания завершится успешно.Если я ввожу правильное имя пользователя и действительный / недействительный / пустой пароль, операция связывания завершается с ошибкой «Неверные учетные данные».

Я просмотрел другие потоки и прочитал документацию по net-ldap, но не могуне понимаю, что я делаю не так.

Может кто-нибудь подсказать, как этого добиться?

Заранее благодарен за любые ответы: -)

Редактировать:

Как и предполагал @StuartEllis, проблема была в идентификаторе пользователя.Чтобы выяснить правильный DN, я использовал следующий скрипт (взятый из документации 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", "username@companyname.com" )
attrs = ["mail", "cn", "sn","objectclass"]
ldap.search( :base => treebase, :filter => filter, :attributes => attrs, :return_result => false ) do |entry|
  puts entry._dump 0
end

Затем я повторил попытку, используя свой оригинальный скрипт (выше), с полученным DN и вуаля!

Ответы [ 2 ]

2 голосов
/ 26 октября 2010

Я полагаю, что данные вашей учетной записи LDAP неверны, но ваш сервер LDAP принимает анонимные привязки, поэтому он работает, если вы не указали правильное имя пользователя и пароль.Идентификаторы пользователей LDAP очень сложны, поэтому я бы посоветовал еще раз проверить всю вещь, включая регистр частей.

1 голос
/ 16 апреля 2011

Вот пример кода, который я использую с гемом net-ldap , чтобы проверить логины пользователей с сервера ActiveDirectory на моей работе:

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
...