forum

www.SAMURAJ-cz.com 

30.07.2010 Bořivoj VÍTEJTE V MÉM SVĚTĚ

Články

Autentizace uživatele vůči AD v PHP

Úterý, 06.11.2007 18:18 | Samuraj | webdesign
Tento článek navazuje na minulé ukázky použití LDAPu v PHP. Jednou užitečnou vlastností, kterou nám přináší přístup přes LDAP k adresářovým službám, je možnost provedení autentizace uživatele. V praxi tak můžeme, třeba na intranetu, autentizovat uživatele jeho doménovým účtem proti Active Directory. Článek ukazuje jednoduchý příklad, jak to provést. Samozřejmě lepší by ještě bylo využití Single Sign On, ale to již není tak jednoduché.

Článek navazuje na teoretický úvod Adresářové služby a LDAP a Autentizace v LDAPu (AD). A praktické ukázky použití LDAPu v Jak na LDAP a LDAPS v PHP pod Windows. Věnuje se prakticky možnosti, jak autentizovat uživatele vůči Active Directory pomocí kódu v PHP.

Jak bylo zmíněno v článku o autentizaci v LDAPu, tak pro autentizaci uživatele můžeme v praxi použít právě protokol LDAP a jeho operaci bind. Jinou možností by byla nějaká externí služba, například RADIUS server. Pomocí LDAP bind máme dvě možnosti, buďto simple bind nebo SASL bind.

Simple bind

Nejjednodušší metoda, ale také nejméně bezpečná, je použití simple bind. V tomto případě se veškerá (autentizační) data přenáší v plain textu, tedy čistém a nešifrovaném textu. Adresářovým službám zasíláme uživatelské jméno ve tvaru DN (Distinguished Name), tedy třeba CN=Uzivatel,OU=Users,DC=firma,DC=local. V praxi jsem ověřil, že pro Active Directory je možno použít jméno i v UPN tvaru (User Principal Name) , tedy uzivatel@firma.local, nebo ve tvaru doména\uživatelské jméno.

Protože se heslo posílá v čistém textu, tak se určitě doporučuje použít přenos přes šifrovaný kanál. Můžeme použít SSL nebo TLS. Já používám SSL a tedy LDAPS.

Pozn.: Důležité upozornění je, že je třeba kontrolovat, zda uživatel nezadal prázdné heslo, protože AD by pak uvažovalo anonymní přihlášení a vrátilo by true.

function authUserAD($username, $password, $DomainName="firma.local", $ldap_server="ldaps://192.168.0.1") { 
  $auth_user = $username."@".$DomainName;
  if($connect = ldap_connect($ldap_server)){
    ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3);
    ldap_set_option($ds, LDAP_OPT_REFERRALS, 0);
    if(ldap_bind($connect, $auth_user, $password)) {
      ldap_close($connect);
      return(true);
    }
  }
  ldap_close($connect);
  return(false);
}
if(authUserAD("uzivatel", "Heslo")) echo "<p>Přihlášení je OK.</p>";
else echo "<p>Přihlášení se nezdařilo.</p>";

SASL bind

Podle poznámek u LDAP funkcí, PHP podporuje SASL. Je potřeba, aby bylo PHP zkompilováno s podporou SASL a vyžaduje knihovny libeay32.dll, ssleay32.dll (případně ještě libsasl.dll). PHP verze 5 obsahuje funkci (v podstatě nedokumentovanou) ldap_sasl_bind. Tu se mi však nepodařilo rozchodit, nezískal jsem pro Windows verzi PHP se SASL podporou.

Další možnosti

Jinou možností je využít nějaký modul pro Apache server (nebo použít IIS). Navíc tyto moduly většinou umožňují využít SSO (Single Sign On), pokud to podporuje klient.

  • mod_ntlm
  • mod_ntlm2
  • mod_auth_ntlm_winbind
  • mod_auth_sspi
  • mod_auth_gssapi
  • kerb_auth_mod
  • mod_auth_kerb
zobrazeno: 4604krát | Komentáře [0]

Související články:

LDAP a Active Directory

Správa počítačové sítě ala Microsoft, to je Active Directory. Jedná se o velice rozsáhlou skupinu technologií a služeb. Základem jsou adresářové služby, adresáře a komunikační protokol LDAP.

Pokud se Vám článek líbil, tak mne potěšíte, když uložíte odkaz na některý server:
  linkuj.cz | jagg.cz | vybrali.sme.sk | del.icio.us.

Pokud se chcete vyjádřit k tomuto článku, využijte komentáře níže. Pokud chcete poradit s nějakým problémem či diskutovat na nějaké téma, tak použijte fórum.

Komentáře

Zatím tento záznam nikdo nekomentoval.

Přidat komentář

Vložit tag: strong em link

Vložit smajlík: :-) ;-) :-( :-O


Ochrana proti SPAMu, zdejte následující čtyři znaky image code

Nápověda:
  • maximální délka komentáře je 2000 znaků
  • HTML tagy nejsou povoleny (budou odstraněny), použít se mohou pouze speciální tagy (jsou uvedeny nad vstupním polem)
  • nový řádek (ENTER) ukončí odstavec a začne nový
  • pokud odpovídáte na jiný komentář, vložte na začátek odstavce (řádku) číslo komentáře v hranatých závorkách