3

我目前正在从事一个负责用户身份验证的 Rails 项目。我们决定使用第三方身份验证,我尝试按照示例设置进行操作。该示例由 Kevin Thompson 完成,称为example

根据 LDAP 服务器的文档,我需要做的步骤是:

  1. 连接到 LDAP 服务器。
  2. 匿名绑定(无 DN 和密码)。
  3. 使用用户名搜索 LDAP 条目
  4. 如果找到,则检索用户名的 DN。
  5. 使用他们提供的用户 DN 和密码重新绑定。
  6. 如果此重新绑定成功,则用户已通过身份验证。

我遵循了 Thompson 的例子,只是我没有使用 nifty;使用设计进行用户管理和omniauth-ldap 进行身份验证。但是,它不太有效,我想知道它是否与服务器文档告诉我的操作与omniauth-ldap 实际操作之间的差异有关...

具体来说,我的问题是我总是收到“无效凭据”错误。这是因为我需要做的事情与omniauth-ldap正在做的事情不匹配吗?

建议或建议将不胜感激!

关于我如何设置的更多信息(为了保持匿名,我替换了一些东西)我可以根据要求发布更多代码。

配置/初始化程序/devise.rb:

  config.omniauth :ldap,
    :host => 'ldap1.its.domain.ext',
    :base => 'ou=People, dc=domain, dc=ext',
    :port => 389,
    :attrs => 'uid',
    :method => :plain,
    :uid => 'uid'

应用程序/控制器/用户/omniauth_callbacks_controller.rb:

class Users::OmniauthCallbacksController <     Devise::OmniauthCallbacksController
  skip_before_filter :verify_authenticity_token
  def ldap
    ldap_return = request.env["omniauth.auth"]["extra"]["raw_info"]
    username = ldap_return.uid[0].to_s

    if @user = User.find_by_username(username)
      sign_in_and_redirect @user
    else
      @user = User.create(:username => username,)
      sign_in_and_redirect @user
    end
  end
end
4

2 回答 2

5

我刚刚解决了一个类似的问题。

首先,您需要确定您的域是否允许匿名绑定。在我的情况下这是不允许的。使用当前用户绑定有一个很好的拉取请求,dorren/omniauth-ldap。否则,您将需要一个系统帐户。只是为了开始行动,我使用了我的用户名(即 userPrincipalName)/密码:bind_dn 和 :password。

其次,对于 LDAP 身份验证,用于身份验证的两个 uid 值是 sAMAccountName(username)userPrincipalName(username@ldap.domain.ext)。我发现我的系统使用了 userPrincipalName。为了防止用户输入,我只是在提交表单之前连接了域。

试试这个配置。

config.omniauth :ldap,
  :host => 'ldap.domain.ext',
  :base => 'dc=ldap, dc=domain, dc=ext',
  :port => 389,
  :method => :plain,
  :uid => 'userPrincipalName',
  :bind_dn => 'bind_dn',
  :password => 'password' 

我相信 :bind_dn 可以是以下形式:

'CN=姓\,名字,OU=人,DC=ldap,DC=域,DC=ext'

或者

'用户名@ldap.domain.ext'

我还发现使用 Net::LDAP 编写一个 ruby​​ 脚本来绑定和搜索也确实帮助我了解了 Active Directory,因为在执行此任务之前我对这个主题一无所知。

于 2013-09-27T15:18:40.667 回答
0

我不能将此添加为评论,因为我还没有 50 声望,但是我发现这可能对这里的某些人有用。

http://blackfistsecurity.blogspot.com.au/2011/12/rails-authentication-using-devise-and.html

我最初试图在没有其他任何东西的情况下使用 Omniauth 和 Omniauth-LDAP,但是缺少有关 Omniauth-ldap 部分的文档使事情变得困难。

编辑:

我最终没有使用 Omniauth-LDAP,而是选择了 vanilla devise 安装,并编写了自己的 LDAP 功能。请注意:我使用 mongoid,因此下面的代码是针对 MongoDB 的。然而,它可以很容易地为 ActiveRecord 修改。

为了做到这一点,我new在控制器中编辑了动作sessions,类似于如下:

ldap = Net::LDAP.new
ldap.host = 'domainOrIP'
ldap.port = 389

ldap.auth 'user', 'password'

if ldap.bind
    # success, so let's check if the user exists
     @existing_user = User.where({username: params[:user][:username] }).first

     if @existing_user == nil
       #create the user
         @user = User.new( {username: params[:user][:username], password: ''})
         # I didn't personally store the user's password, as I use LDAP for authentication. (If you save this, please hash and salt it first!!)
         @user.save
         flash[:notice] = "Success!"
         redirect_to '/'
     else # already existed
       @user = User.find({ username: params[:user][:username] })
         flash[:notice]  = "Success!"
         redirect_to '/'
     end
else
    flash[:danger] = "An error occurred whilst authenticating with your LDAP server. Please check the configuration and try again."
    redirect_to '/'
end

然后我离开了 Devise 来处理其他所有事情。对我来说工作得很好——上面的代码来自记忆,但是可能不是 100% 准确的。:)

编辑 2: 关于如何使用 Net::LDAP 类的更多信息可以在这里找到: http ://www.rubydoc.info/gems/ruby-net-ldap/Net/LDAP

于 2015-01-21T01:00:57.487 回答