【问题标题】:How to check for user credentials using active directory and a ruby script如何使用活动目录和 ruby​​ 脚本检查用户凭据
【发布时间】:2010-10-25 21:43:23
【问题描述】:

我正在尝试编写一个 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 重试,瞧!

【问题讨论】:

    标签: ruby active-directory ldap


    【解决方案1】:

    我猜您的 LDAP 帐户详细信息不正确,但您的 LDAP 服务器接受匿名绑定,这就是为什么当您不指定有效的用户名和密码时它可以工作的原因。 LDAP 用户标识符非常复杂,所以我建议仔细检查整个内容,包括部分的大小写。

    【讨论】:

      【解决方案2】:

      这是我在工作中使用net-ldap gem 来验证来自 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-22
        • 1970-01-01
        • 1970-01-01
        • 2020-05-05
        • 2021-01-09
        • 1970-01-01
        • 2015-01-27
        相关资源
        最近更新 更多