Как добавить пароль аутентификации Active Directory с помощью PHP? - PullRequest
0 голосов
/ 02 октября 2019

Я прихожу к вам, потому что у меня есть небольшая проблема с сервером Active Directory, действительно я могу подключиться, чтобы получить своих пользователей ... когда я добавляю пользователя с помощью программного обеспечения AD, я назначаю ему пароль, и этот включендля аутентификации в PHP с формой, ничего ненормального.

Проблема в том, что когда я добавляю пользователя напрямую с помощью PHP, я использую этот код

 $ldapconn=ldap_connect("adress");
 $ldapbind=ldap_bind($ldapconn, "local", "test");
 $cn = $info["cn"][0] = "test test ";
 $info["sn"][0] ="test ";
 $info["givenname"][0] ="test ";
 $info["displayname"][0] ="test test ";
 $info["name"][0] ="test test ";
 $info["userprincipalname"][0] = "test @test .test ";
 $info["samaccountname"][0] = "ttest ";

 $info["objectClass"][0]="top";
 $info["objectClass"][1]="person";
 $info["objectClass"][2]="organizationalPerson";
 $info["objectClass"][3]="user";
 $info["objectCategory"][0] ="CN=Person,CN=Schema,CN=Configuration,DC=test 
 ,DC=test ";
 $info['userPassword'][0] = "test ";

// add entries
$r = ldap_add($ldapconn,"CN=".$cn.",OU=Utilisateurs,DC=test ,DC=test ", $info);

Мой пользователь добавлен правильно, но аутентификация phpне сделано, мой пользователь не имеет пароля аутентификации, но пароль, который должен использоваться для чего-то другого, я прочитал в сети, что $ info ['userPassword'] позволяет создать пароль, который не может использоваться для аутентификации. У кого-то будет точный атрибут, чтобы создать этот пароль, пожалуйста.

Заранее благодарю за помощь.

Я также пытался с атрибутом $ info ['unicodePwd'], но я получаюсообщение об ошибке «Добавить: сервер не хочет выполнять».

Ответы [ 2 ]

0 голосов
/ 03 октября 2019

Спасибо за ваш ответ, я попробовал ваше решение, не ставя «[unicodepwd]» и не используя впоследствии «ldap_mod_replace», но я получаю сообщение об ошибке «сервер не хочет выполнять».

Я думаю, что мой сервер настроен особым образом.

Я нашел другое решение, я использую инструмент "Adldap2" (https://adldap2.github.io/Adldap2/#/?id=what-is-adldap2),, который содержит все функции, необходимые для использования LDAP с PHP.

Я рекомендую его всем, у кого есть проблемы с Active Directory. Например, моя проблема была решена с помощью этого кода:

enter code include __DIR__ . '/vendor/autoload.php';
$config = [
    // Mandatory Configuration Options
    'hosts'            => ['testServer'],
    'base_dn'          => 'dc=test,dc=test',
    'username'         => 'test@test.test',
    'password'         => 'test',
    'account_suffix'   => '@test.test',
    'port'             => 636,
    'use_ssl'          => true,
];
$ad = new Adldap\Adldap();
$connectionName = 'my-connection';
$ad->addProvider($config, $connectionName);
try {
    $provider = $ad->connect($connectionName);
    echo"Connection ok <br>" ;
    // Great, we're connected!
} catch (Adldap\Auth\BindException $e) {
    // Failed to connect.
    echo"Connection failed<br>" ;
}

    $user = $provider->make()->user([
    'cn' => 'test test ',
    'userprincipalname' => 'test@test.test',
    'accountExpires'=> 132188680854770000
]);
$user->setDn("CN=test tes ,OU=test ,DC=test,DC=test");
$dn = $user->getDn();
$user->setDisplayName('test test ');
$user->setAccountName('ttest');
$user->setFirstName('test');
$user->setLastName('test');
$attribut = $user->getAttributes();
var_dump($attribut);
$user->setEmail('test@test.test');
// Save the new user.
// Enable the new user (using user account control).
if ($user->save()) {
    // Enable the new user (using user account control).
    $user->setUserAccountControl(66048);

    // Set new user password
    $user->setPassword('test');

    // Save the user.
    if($user->save()) {
        // The password was saved successfully.
    }
}

надеюсь, что это поможет:)

0 голосов
/ 02 октября 2019

Атрибут userPassword иногда работает, но действительный атрибут unicodePwd.

Есть несколько предостережений:

  1. Вы должны быть подключены к AD через зашифрованное соединение. Это означает, что LDAP через SSL (LDAPS). Поэтому при звонке на ldap_connect вам необходимо использовать ldaps://example.com. Это может привести к появлению червя, поскольку приложению необходимо доверять SSL-сертификату, отправляемому сервером. некоторые комментарии на странице документации могут помочь.

  2. Формат значения, которое вы присвоили unicodePwd, должен быть:

, указанный в строке Unicode в кодировке UTF-16, содержащей пароль, заключенный в кавычки, который был закодирован в виде BER в виде строки октетов в соответствии с синтаксисом Object (Replica-Link).

На странице документации есть также пример для ldap-mod-replace:

$newPassword = "MyPassword";
$newPassword = "\"" . $newPassword . "\"";

$len = strlen($newPassword);
for ($i = 0; $i < $len; $i++)
        $newPassw .= "{$newPassword{$i}}\000";

$newPassword = $newPassw;
$userdata["unicodepwd"] = $newPassword;
$result = ldap_mod_replace($ad, $userDn, $userdata);
if ($result) echo "User modified!" ;
else echo "There was a problem!";

Возможно, вам придется использовать ldap_mod_replace для установки пароля послесначала создайте учетную запись (вместо использования $info['unicodepwd'][0] при создании учетной записи). По моему опыту, мне всегда приходилось сначала создавать учетную запись, а затем устанавливать пароль.

Но из-за отсутствия пароля сначала учетные записи обычно отключаются (в зависимости от ваших политик). Поэтому вам, вероятно, придется установить атрибут userAccountControl на 512 (NORMAL_ACCOUNT), чтобы включить его после того, как вы установили пароль.

...