[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: IIS, Digest, PHP
Kuzya
Здравствуйте. Потребовалось сделать сайт с авторизацией пользователей по данным домена (Digest-авторизация). Сайт поднят на IIS 6.0, внутри всё работает на PHP. Авторизацию включил, всё нормально. Захожу на сайт, IIS просит ввести логин+пароль, ввожу данные одного из пользователей домена и попадаю на сайт. Всё работает, всё классно. В PHP, в массив $_SERVER, передаются следующие данные (оставил только ключи связанные с пользователем и доменом):
Код
array(41) {
 ["AUTH_TYPE"]=>
 string(6) "Digest"
 ["AUTH_USER"]=>
 string(10) "DIPLOM\one"
 ["REMOTE_USER"]=>
 string(10) "DIPLOM\one"
 ["APPL_MD_PATH"]=>
 string(25) "/LM/W3SVC/1004159616/Root"
 ["INSTANCE_ID"]=>
 string(10) "1004159616"
 ["INSTANCE_META_PATH"]=>
 string(20) "/LM/W3SVC/1004159616"
 ["LOGON_USER"]=>
 string(10) "DIPLOM\one"
 ["HTTP_AUTHORIZATION"]=>
 string(331) "Digest username="one",realm="diplom.local", nonce="86c55627e3b4c901ba6666b1b30e29c3296a05637b2 b4abaca0bb8a805828f3287b7cd54e4de1285", uri="/test.php",cnonce="0bbdef251b33f385172bbcccf69c0b51", nc=00000001,algorithm=MD5-sess,response="03a3041090bfacc9e841eca7cdfc64a5", qop="auth",opaque="a9826d7877c4f67491b9b0507d3548e1", charset=utf-8"
 ["HTTP_HOST"]=>
 string(7) "ndiplom"
 ["PHP_AUTH_DIGEST"]=>
 string(324) "username="one",realm="diplom.local", nonce="86c55627e3b4c901ba6666b1b30e29c3296a05637b2b4a baca0bb8a805828f3287b7cd54e4de1285",uri="/test.php", cnonce="0bbdef251b33f385172bbcccf69c0b51",nc=00000001, algorithm=MD5-sess, response="03a3041090bfacc9e841eca7cdfc64a5", qop="auth",opaque="a9826d7877c4f67491b9b0507d3548e1", charset=utf-8"

Как видите из открытых данные здесь есть только домен и имя пользователя (если кто-то знает что такое "/LM/W3SVC/1004159616/Root" то буду благодарен за объяснения =)). Вопрос - как получить группу в которой состоит пользователь в домене и все его данные которые вводятся при регистрации типа имени, фамилии, инициалов и т.д.?



Спустя 30 минут, 34 секунды (4.04.2009 - 08:55) Kuzya написал(а):
Нашёл на phpclub следующее решение:
PHP
вот эта конструкция у нас работает
function ldap_auth($serv,$dn,$user,$psw)
{
if (
strlen(trim($psw))==or strlen(trim($user))==0){log_out(__FILE__,__LINE__,"Пароль или пользователь не введены пользователь: $user пароль: ********",""); return 0;}
if (!(
$ds=@ldap_connect($serv))){log_out(__FILE__,__LINE__,ldap_error($ds)."\nНе удалось подключиться к серверу ldap: $serv",""); return 0;}
if (!(
$sr=@ldap_search($ds,$dn,"cn=$user"))){log_out(__FILE__,__LINE__,ldap_error($ds)."\nОшибка поиска пользователя: $user",""); return 0;}
if (
ldap_count_entries($ds,$sr)!=1){log_out(__FILE__,__LINE__,"Не удалось найти пользователя: $user",""); return 0;}
if (!(
$fentry=ldap_first_entry($ds,$sr))){log_out(__FILE__,__LINE__,ldap_error($ds)."\nОшибка получения результата поиска 8)",""); return 0;}
if (!(
$r=@ldap_bind($ds,ldap_get_dn($ds,$fentry),$psw))){log_out(__FILE__,__LINE__,"Не правильный пароль для пользователя: $user",""); return 0;}
if (!(
$values=ldap_get_values($ds,$fentry,"groups"))){log_out(__FILE__,__LINE__,ldap_error($ds)."Ошибка получения значения атрибута: groups для пользователя: $user",""); return 0;}
return 
$values;
}

юзаем примерно так
$groups
=ldap_auth("xxx.xxx.xxx.xxx","o=XXXXX","login","password");

Так как не сильно разбираюсь в этом то не могу понять что за "o=***" передающаяся вторым параметром?

Спустя 1 день, 7 часов, 8 минут, 7 секунд (5.04.2009 - 16:03) Kuzya написал(а):
Всё ещё пытаюсь решить свою проблему через LDAP-поиск. Почти приблизился к решению. Не совсем хорошо (а точнее почти никак) разбираюсь в работе с ActiveDirectory через PHP. Сейчас суть моей задачи в том что бы при выходе авторизовать пользователя и в сессию положить его имя, id и группы в которые он входит. Используя LDAP я смог нормально подключится и проверить существования пользователя (функцией ldap_bind). А когда стало нужно извлечь данные о пользователе то я запоролся. Вот используемый код :
(Имя пользователя "one", пароль "123abc!", имя машины "dipl", имя домена "diplom.local")

PHP
$ldap_addr = "192.168.244.5";
$g_res = ldap_connect($ldap_addr);
if(
$g_res)
{
    print "Connected to ladp-server<br />";
}
 else {
    print "can`t connect to addr {$ldap_addr}";
    exit;
}

$bind_user = ldap_bind($g_res, "one@diplom.local", "123abc!");
if ($bind_user)
{
    print "User binded!<br />";
}
 else {
    print "can`t bind user!<br />";
    exit;
}

$sr=ldap_search($g_res,"dc=dipl,dc=diplom,dc=local", "(samaccountname=one)", array("*") );
$info = ldap_get_entries($g_res, $sr);
var_dump($info);


Всё хорошо работает до вызова ldap_search. Проблема в строке "dc=dipl,dc=diplom,dc=local". Если честно то я даже не знаю что туда писать. Нашёл расшифровки для всего того что можно в ней указать (o,cn,dc и т.д.) но не знаю что в эти параметры поместить и какие из них обязательны. Я знаю имя машины и домена, их и пишу. Но при любом случае функция выдаёт ошибку:
"Warning: ldap_search() [function.ldap-search]: Search: No such object in ... on line ..."
Помогите пожалуйста, второй день мучаюсь.
P.S. в редакторе запросов AD нужный мне запрос выглядит вот так: "(&(objectCategory=person)(objectClass=user)(name=one))"

Помощь нужна очень срочно! Буду крайне благодарен хотя бы за подсказки.

Спустя 1 день, 23 часа, 37 минут, 43 секунды (7.04.2009 - 15:41) Kuzya написал(а):
Всё, сделал окончательно. Вдруг кому пригодится. Вот запрос:
$sr=ldap_search($g_res,"CN=Users,DC=diplom,DC=local", "samaccountname=one", array("*") );
показываем все данные по пользователю указанного домена (diplom.local) =)
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.