Как привязать к серверу AD в PHP с учетными данными из доверенного домена? - PullRequest
9 голосов
/ 07 июля 2011

У нас есть несколько серверов AD с установленным доверием леса между ними, поэтому пользователи Windows из разных доменов могут получить доступ к ограниченным ресурсам. Предположим, у нас есть domainA.com и domainB.com, поэтому любой пользователь из домена domainB.com может войти в ресурс на domainA.com. В целях безопасности анонимный доступ к серверам LDAP отключен администраторами.

Теперь нам нужно перечислить всех пользователей со всех серверов LDAP в нашем PHP-коде с помощью клиента OpenLDAP. Ниже приведен код PHP для получения информации обо всех пользователях из domainB.com

define('USER', 'user@domainA.com'); // User from domainA.com here
$ldap = ldap_connect('domainB.com') or die('Bad connection');
ldap_set_option($ldap, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($ldap, LDAP_OPT_REFERRALS, 0);
ldap_bind($ldap, USER, PASS) or die('Cannot bind');

Мой скрипт умирает с сообщением «Cannot bind» с ошибкой ldap «49 Invalid credentials». Дополнительная информация от AD:
80090308: LdapErr: DSID-0C0903A9, комментарий: ошибка AcceptSecurityContext, данные 52e, v1db1

Я думаю, что проблема в простом механизме аутентификации, потому что когда я использую аутентификацию согласования GSS в клиенте администратора Ldap с теми же учетными данными для user@domainA.com, все в порядке.

Что я могу сделать для успешного связывания на domainB.com с учетными данными от user@domainA.com?

UPD1 Аутентификация с помощью SASL DIGEST-MD5

ldap_sasl_bind ( $ldap, '', $pass, 'DIGEST-MD5', null, 'user@domainA.com');

Журналы от AD:

The computer attempted to validate the credentials for an account.

Authentication Package: WDigest
Logon Account:  user
Source Workstation: DOMAINA
Error Code: 0xc000006a

An account failed to log on.

Subject:
    Security ID:        NULL SID
    Account Name:       -
    Account Domain:     -
    Logon ID:       0x0

Logon Type:         3

Account For Which Logon Failed:
    Security ID:        NULL SID
    Account Name:       user@domainA.com
    Account Domain:     domainA.com

Failure Information:
    Failure Reason:     An Error occured during Logon.
    Status:         0xc000006d
    Sub Status:     0xc000006d

Process Information:
    Caller Process ID:  0x0
    Caller Process Name:    -

Network Information:
    Workstation Name:   -
    Source Network Address: 
    Source Port:        

Detailed Authentication Information:
    Logon Process:      WDIGEST
    Authentication Package: WDigest
    Transited Services: -
    Package Name (NTLM only):   -
    Key Length:     0

This event is generated when a logon request fails. It is generated on the computer where access was attempted.

The Subject fields indicate the account on the local system which requested the logon. This is most commonly a service such as the Server service, or a local process such as Winlogon.exe or Services.exe.

The Logon Type field indicates the kind of logon that was requested. The most common types are 2 (interactive) and 3 (network).

The Process Information fields indicate which account and process on the system requested the logon.

The Network Information fields indicate where a remote logon request originated. Workstation name is not always available and may be left blank in some cases.

The authentication information fields provide detailed information about this specific logon request.
    - Transited services indicate which intermediate services have participated in this logon request.
    - Package name indicates which sub-protocol was used among the NTLM protocols.

Ответы [ 2 ]

2 голосов
/ 13 января 2012

Я столкнулся с этой проблемой при настройке Moodle, который использует библиотеки PHP LDAP и OpenLDAP для подключения к серверам AD.Решение было довольно простым, и одна из двух вещей (которые на самом деле сводились к одной вещи):

  1. Использовать имя пользователя с незаданной областью (то есть, после имени пользователя не должно быть «@ example.com»)
  2. Используйте DOMAIN \ username

По сути, единственное, что сводилось к получению, - это получение правильного, ожидаемого синтаксиса имени пользователя.Я думаю, что это зависит от конкретной конфигурации AD, потому что я видел четыре типа имен пользователей, которые работают на разных серверах AD: полное DN, ограниченное имя пользователя (т.е. выглядит как адрес электронной почты), DOMAIN \ username и обычное имя пользователя.

1 голос
/ 08 июля 2011

Когда вы указываете пользователя в ldap_bind, можете ли вы попытаться добавить свой DN пользователя следующим образом:

$bind = ldap_bind($resource, 'cn=jpb,cn=users,dc=dom,dc=fr', '***'); 

Еще одна вещь, в вашем ' Active-Directory Forest 'у вас есть один или несколько контроллеров домена, которые поддерживают каталог с именем ' Global Catalog ' (GC).GC содержит все объекты всех каталогов вашего леса.


Отредактировано Вы можете попробовать связать с SASL

$ldap = ldap_connect('domainB.com');
ldap_set_option($ldap, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($ldap, LDAP_OPT_REFERRALS, 0); 
ldap_sasl_bind ( $conn, NULL,"password",'DIGEST-MD5',NULL,'user@domainA.com',NULL);
...