Omniauth-ldap 无效凭证

Omniauth-ldap invalid credentials

我很难让 omniauth-ldap 与我们的 AD 服务器正常工作,我相信这是因为我们的用户名中包含我们的域名。

这将成功连接到我们的 ldap 服务器:

ldapsearch -h ldap.ourdomain.com -b "dc=ourdomain,dc=int" -D "OURDOMAIN\username" -w <password> '(sAMAccountName=username)'

但是,OmniAuth 中的这些设置只会导致 "invalid credentials"

Padrino.use OmniAuth::Strategies::LDAP,
    :host => "ldap.ourdomain.com",
    :base => "dc=OURDOMAIN,dc=INT",
    :uid => "sAMAccountName",
    :bind_dn => 'OURDOMAIN\%{username}',
    # This is hard coded for now, but I need it to be the value entered by the user
    :password => "mypassword"

更新

进一步研究,我发现如果未设置 :bind_dn 和 :password,omniauth-ldap 会将绑定方法设置为 :anonymous。

但是,如果设置了值 ,它不会插入用户名并且不会提供用户输入的密码。

我需要的是

:bind_dn => 'OURDOMAIN\<user entered username>',
:password => <user entered password>

但是密码和输入的用户名只有在硬编码时才会提供给连接。

这主要是因为 omniauth-ldap 的设计选择。 设计是用户提供的用户名(电子邮件或 ID)不足以构建可用于绑定的 DN(专有名称)。因此,omniauth ldap 所做的是

  1. 调用 ldap 搜索(bind_dn 如果您的 AD/LDAP 不允许匿名搜索,则使用密码)为用户提取 DN。
  2. 然后使用步骤 1 中的 DN 和用户输入的密码绑定到 LDAP/AP。

我认为步骤 1) 是不必要的。大多数 DN 可以从用户名派生。

我必须通过创建服务帐户来解决这个问题。该帐户登录然后查询实际尝试登录的用户的存在和有效性。服务帐户凭据可以在您的 Omniauth 配置中设置,然后您可以像使用任何其他 omniauth 方法一样使用 omniauth-ldap。