active-directory - 使用 Zend\Authentication\Adapter\Ldap (ZF2) 根据 Active Directory 验证凭据

标签 active-directory ldap zend-framework2 zend-auth

我想根据 ZF2 应用程序中的事件目录检查用户名/密码。我使用 Zend\Authentication\Adapter\Ldap 来实现此目的,并且它可以部分工作。

这是我的代码:

use Zend\Authentication\AuthenticationService;
use Zend\Authentication\Adapter\Ldap as AuthAdapter;    

$username = 'johndoe';
$password = 'xxx';

$auth = new AuthenticationService();
$adapter = new AuthAdapter(
    array('server1'=>array(
        'host' => '192.168.0.3',
        'useStartTls' => false,
        'useSsl' => false,
        'accountDomainName' => 'domain.local',
        'accountDomainNameShort' => 'DOMAIN',
        'accountCanonicalForm' => 3,
        'accountFilterFormat' => '(&(objectClass=user)(sAMAccountName=%s))',
        'baseDn' => 'CN=Users,DC=domain,DC=local',
        'bindRequiresDn' => false,
        'optReferrals' => false
    )), 
    $username, 
    $password
);

$result = $auth->authenticate($adapter);

var_dump($result);

如果我设置了错误的密码,我会得到以下结果:

object(Zend\Authentication\Result)#279 (3) {
  ["code":protected]=>
  int(-3)
  ["identity":protected]=>
  string(3) "johndoe"
  ["messages":protected]=>
  array(4) {
    [0]=>
    string(19) "Invalid credentials"
    [1]=>
    string(124) "0x31 (Invalid credentials; 80090308: LdapErr: DSID-0C0903AA, comment:     AcceptSecurityContext error, data 52e, v1772): DOMAIN\johndoe"
    [2]=>
    string(238) "host=192.168.0.3,useStartTls=,useSsl=,accountDomainName=domain.local,accountDomainNameShort=DOMAIN,accountCanonicalForm=3,accountFilterFormat=(&(objectClass=user)(sAMAccountName=%s)),baseDn=CN=Users,DC=domain,DC=local,bindRequiresDn=,optReferrals="
    [3]=>
    string(151) "johndoe authentication failed: 0x31 (Invalid credentials; 80090308: LdapErr: DSID-0C0903AA, comment: AcceptSecurityContext error, data 52e, v1772): DOMAIN\johndoe"
  }
}

使用正确的密码,结果会发生变化:

object(Zend\Authentication\Result)#279 (3) {
  ["code":protected]=>
  int(-1)
  ["identity":protected]=>
  string(3) "johndoe"
  ["messages":protected]=>
  array(4) {
    [0]=>
    string(22) "Account not found: johndoe"
    [1]=>
    string(68) "0x20: No object found for: (&(objectClass=user)(sAMAccountName=johndoe))"
    [2]=>
    string(238) "host=192.168.0.3,useStartTls=,useSsl=,accountDomainName=domain.local,accountDomainNameShort=DOMAIN,accountCanonicalForm=3,accountFilterFormat=(&(objectClass=user)(sAMAccountName=%s)),baseDn=CN=Users,DC=domain,DC=local,bindRequiresDn=,optReferrals="
    [3]=>
    string(95) "johndoe authentication failed: 0x20: No object found for: (&(objectClass=user)(sAMAccountName=johndoe))"
  }
}

为什么没有找到帐户?我的 accountFilterFormat 有问题吗?

sAMAccountName 和 objectClass 似乎有效。我使用 Sysinternals Active Directory 浏览器检查了这一点: Active Directory Browser Active Directory Browser Properties

使用此工具进行类似搜索效果很好: Active Directory Browser Search

最佳答案

只是猜测,但也许是因为 objectClass 不是 user 而是 top;person;...;user

关于active-directory - 使用 Zend\Authentication\Adapter\Ldap (ZF2) 根据 Active Directory 验证凭据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16231615/

相关文章:

powershell - 如何使用PowerShell在New-ADUser中设置msTSInitialProgram?

php - zf2 没有使用 PHP 5 "DateTime"类

javascript - 模态布局放在哪里以及如何用动态内容填充它

Azure AD 不显示用户同意页面并在登录时返回 AADSTS65001,仅适用于某些 AD 租户

c# - 如何使用 C# 在 Active Directory 中更改电话号码

c# - 您如何找出网络上的工作站和服务器之间的区别?

ruby - LDAP(或 LDAP 的任何 Ruby 客户端库)是否支持批量调用?

spring - 如何使用 LDAP 和基于角色的数据库授予权限来实现 Spring Security?

authentication - 如何为 Mantis - LDAP 和数据库用户设置双重身份验证?

php - 如何在zf2 AbstractRestfulController中调用模板文件