Autor Zpráva
Clint
Profil
Zdravím,
potřeboval bych poradit.

Existuje podniková sít (extranet) do které se přihlašují uživatelé a mohou pracovat s počítačem. Co mi bylo sděleno, tak tyto informace se nacházejí v LDAP (jedná se o autentizaci NTLM).

V síti je server bežící na iis6 s php, mysql,

Příjdu k počítači, přihlásím se a jakým způsobem v php, získám informace o uživateli (čili o mě) - glob. proměnná $_SERVER[„LOGON_USER“] je prázdná, takže musím nějak vytáhnout data z LDAP, ale funkce ldap_read, chce po mě username a passwort a právě username je to co chci zjistit.

Případně jestli neexistuje jiný způsob

Díky za help
okolojsoucí
Profil
Zkuste toto:
$ldap = @ldap_connect($yourHostname);
$query = @ldap_search($ldap, 'o=example', 'cn=cihats');
$results = @ldap_get_entries($ldap, $query);

if ($results['count']) {
  print_r($results);
} else {
  echo "No such common name";
}
http://stackoverflow.com/questions/15503677/find-username-with-ldap

Případně ohledně serveru bych zkusil toto
function getUserName(){
  $username = null;
  $check = array('LOGON_USER', 'AUTH_USER', 'REDIRECT_LOGON_USER', 'REDIRECT_AUTH_USER');
  foreach($check as $index){
      if(array_key_exists($index, $_SERVER)){
          $username = $_SERVER[$index];
      }
  }
  return $username;
}
http://stackoverflow.com/questions/15387558/serverlogon-user-returns-no-value
peta
Profil
Abys mohl vytahnout informace z sql db, musis se prihlasit. Bud jako admin nebo uzivatel, ktery ma pravo cist data z dane tabulky.
Totez funguje u ldap, take tam mas uzivatele admin, uzivatele na prohlizeni, uzivatele na pristup.

function LDAPSearch1($_filter,$_att)
{
global $ERRORS,$LDAP;
ldap_set_option($LDAP['conn'], LDAP_OPT_DEREF, 2);    //LDAP_DEREF_NEVER
$result = ldap_search($LDAP['conn'],$LDAP['DN'],$_filter,$_att) or die(ldap_error($LDAP['conn']));
$count  = ldap_count_entries($LDAP['conn'], $result);
$data   = ($count>0) ? ldap_get_entries($LDAP['conn'], $result) : null;
ldap_free_result($result);
return $data;
}

function LDAPConnect()
{
global $LDAP;
$LDAP['conn'] = ldap_connect($LDAP['server']) or die("Not connect: ". $LDAP['server'] ."Chyba: ". ldap_error($LDAP['conn']));
if ($LDAP['conn'])
    {
    // binding to ldap server
    $result = ldap_bind($LDAP['conn'], $LDAP['user'], $LDAP['psw']);
    }
}

function LDAPDisconnect()
{
global $LDAP;
ldap_close($LDAP['conn']);
$LDAP['conn'] = null;
}

$LDAP   = array();
$LDAP['server'] = 'ldap://jmeno.server.cz';        // LDAP server
$LDAP['user']   = 'cn=intercon,ou=system,ou=skup1,o=skup2';    // LDAP user
$LDAP['psw']    = 'heslo';            // LDAP psw
$LDAP['DN']     = 'o=skup2';
$LDAP['conn']   = null;
$LDAP['search'] = array();

LDAPConnect();
$filter = "(&(objectclass=person)(displayname=peter mlich))";
$att    = array();
$data   = LDAPSearch1($filter,$att);
LDAPDisconnect();
Clint
Profil
okolojsoucí:
Díky za help - musím počkat až si na serveru provozní knihovnu pro LDAP, pak prozkouším. A dám vědět
okolojsoucí
Profil
Clint:
Je to pouhý typ. Teď si na virtuál instaluji knihovnu LDAP, tak pokud něco vymyslím tak dám vědět. Když tak vyzkoušej script [#2] a pak od peta [#3]
Clint
Profil
Jednu věc, ale nechápu abych se připojil do LDAP musím zadat username, heslo adalší údaje:
$LDAP   = array();
$LDAP['server'] = 'ldap://jmeno.server.cz';        // LDAP server
$LDAP['user']   = 'cn=intercon,ou=system,ou=skup1,o=skup2';    // LDAP user
$LDAP['psw']    = 'heslo';            // LDAP psw
$LDAP['DN']     = 'o=skup2';
$LDAP['conn']   = null;
$LDAP['search'] = array();

jenže já ty udaje neznám. Mě bylo řečeno, že se uživatel přihlásí do sítě a pokud vstoupí na nějaké stránky, s php skriptem musím zjistit jeho přihlašovací jméno z LDAP a s tím pak budu dále pracovat. A pokud bych tam nastavil nějaké natvrdo username a heslo, tak to bude přeci vracet ten username pod kterým se do LDAP přihlašuji.


Tak mi bylo řečeno, že pokud se uživatel přihlásí do sítě, existuje tam AD (Active Directory), který ověří, zda jsou platný přihlašovací údaje. PHP knihovna LDAP slouží k tomu, abych údaje, které jsou v AD získal. K tomu, abych se připojil přes LDAP potřebuji nějaká username, heslo, domenu atd. Nechápu, když zadám udáje typu username=pepa, heslo=heslo, domena=test.cz, tak přeci získám pepa. Ale já potřebuji získat username aktuálně přihlášeného uživatele v síti u konkrétního počtače. Čili pokud u PC1 bude sedět Jan - vytáhne se mi Jan, u PC2 bude sedět Martin - vytáhne se Martin.

Přiznám se, že v tomhle okruhu jsem úplný nováček.
peta
Profil
Zkus si rozklikat na foru jednotlive php prikazy, odkazy vedou na manual s priklady.
ldap_connect
ldap_bind
ldap_search
ldap_get_entries
U nas to funguje tak, ze se pripojis, prihlasis na univerzalniho uzivatele, vyhledas si, zda existuje uzivatel tveho jmeno a pak se na nej pokusis pres jmeno a heslo prihlasit. Je to zduvodu zabezpeceni. Kdyz se takovy hacker pres ldap_connect pripoji a muze hnedka pouzit search, tak sestavi takovy search, ktery povede ke zhrouceni serveru. Coz je nezadouci. LDAP je totiz pomale, jak snek. Zadne jine udaje nez jmeno, heslo a true/false seznam serveru, pro ktere maji tyto prihlasovaci udaje byt pouzite, bych do nej neukladal.
Clint
Profil
peta:
Projel jsem si ty fce, ale jedna věc mi není jasná, kde zjistím jméno, které chci pomocí ldap_search najít, protože pokud jej budu znát, tak nepotřebuji ldap, právě přes ldap musím zjistit to jméno. A s tím jménem budu pracovat. Nebo funkčnost LDAP chápu špatně.

Teď mě napadlo že pomocí LDAP jen ověřím zda ten uživatel tam je - to bude asi ta hlavní věc. Ale to jméno nevím jak získat

V globální proměnné $_SERVER žádné jméno nemám
peta
Profil
Clint:
Ja ted uplne nerozumim. Kdyz chces prohledavat v LDAP, potrebujes se prihlasit, aspon u nas to tak funguje. Obvykly univerzalni uzivatel je cn=intercon,ou=system (CN = Common Name, OU = Organizational Unit, DC = Domain Component).
okolojsoucí pouzil ldap_connect, ldap_search, ldap_get_entries bez ldap_bind. To je sice cool, ale u nas bys neziskal z ldap nic. Proc by mel ldap rozdava nahodnym kolemjdoucim seznam uzivatelu, ze jo?
Co chces hledat potom nastavujes do filtru pro search
$filter = "(&(objectclass=person)(displayname=peter mlich))";
$filter = "(|(sn=Jakub Ivanov)(givenname=Jakub Ivanov))"; // z nejakeho jineho examplu
$filter = "(&(objectclass=person)(employeestatus=Active)(employeetype=zam)(displayname=".$name."*))";
$filter = "(objectClass=person)";
V mysql by dotaz pro vyhledavani vypadal takhle, jestli to to treba pomuze...
SELECT * FROM `ou=system` WHERE `objectClass`='person'
SELECT * FROM `ou=system` WHERE `objectClass`='person' AND `displayname`='peter mlich'
Blizsi informace ti k tomu poda vas admin. Ti muze rici, do jakych skupin mate rozdelene osoby, hesla a tak.
Clint
Profil
Tak teď jsem úplně ztracen - čili pokud jsem dostal ip serveru a přihlašovací údaje do LDAP je pro mě málo, tedy? A když chci zkontrolovat nějaké jméno, vůdči AD tak to jméno někde musím získat a pak s ním pracovat - a kde to jméno získám. Z hlaviček prohlížeče nebo z něčeho jiného.

A hodnoty pr filtr objectclass, displayname, sn, givenname atd získám kde to mi musí sdělit správce?

... 16:10hod 4.2.2014 - tak connect a bind je za mnou - při použití ldap_search sestavuji filtr: $filter="(Userlogname=$person)";, Userlogname mi řekl správce a příslušnou osobu mi to nenašlo i když tam je
Davex
Profil
Clint:
Přihlašovací jméno uživatele by v případě integrované autentizace v IIS mělo být v

$_SERVER["REMOTE_USER"]
$_SERVER["LOGON_USER"]
$_SERVER["AUTH_USER"]

Kromě toho by mělo být nastaveno i $_SERVER["HTTP_AUTHORIZATION"]. Je-li všechno prázdné, tak by to mohlo znamenat, že uživatel není přihlášen a k webu přistupuje anonymně.
peta
Profil
Clint:
To si musis vykomunikovat s tim spravcem. On ti prave muze rici, na koho se prihlasit s jakymi udaji, aby ti to zobrazilo treba seznam uzivatelu. V ldap je spousta promennych, ze kterych ten, kdo ho u vas zavadel, nektere vybral a ty pouziva. Urcite musel nastavovat nejaky program, aby s tim umel komunikovat a tak vi, co tam zadaval. Jsem ti uvedl priklad z naseho ldap, jak by asi melo vypadat prihlasovani a filter.
Treba to mate v nejake skupine, jako my, objectclass=person + employeestatus=Active + employeestatus=Active, bez ktere to nic nezobrazi. Sak skus zobrazit vsechny
(Userlogname=*)
Tady jsou treba dalsi priklady filtru
http://help.globalscape.com/help/eft6-2/mergedprojects/eft/advanced_ldap_filtering.htm
Clint
Profil
Filtr typu Logon User Name je za mnou ve skutečnosti je to toto: $filter="(sAMAccountName=$person)"; , ještě řeším jednu věc a to nastavení druhého parametru v ldap_search($ldapCon, $baseDN, $filter);, $baseDN je tam DC což je p20.local, pak je tam OU - což je přímo složka ve který se nachází uživateli v mým případě DC=TECH, kde je podsložka Users (a tam jsem už já), takže nastavuji $baseDN takto: $baseDN = "OU=TECH,DC=p20.local"; ale bohužel mi to nic nenajde, jakým způsobem se nastavuje tato věc, chci aby mi to hledalo uživatele v p20.local v TECH a jestli bude mít další podsložky typu E1, E2 ... apod. tak to bude prohledávat ve všech
peta
Profil
Google? :)
"OU=TECH,DC=p20.local"
V tom priklade jsem pouzil pro login uzivatele
$LDAP['user'] = 'cn=intercon,ou=system,ou=skup1,o=skup2';
takze hadam, ze se to pise podobne OU=TECH,OU=Users,DC=p20.local
Clint
Profil
tak to bylo takhle OU=TECH,DC=p20,DC=local pokud jsem napsal OU=TECH,DC=p20.local tak to nejelo

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: