Autor | Zpráva | ||
---|---|---|---|
liborse Profil |
#1 · Zasláno: 25. 4. 2014, 09:59:06
Předem podotýkám, že už druhým dnem hledám jako zběsilý, ale nic, co jsem našel, nefunguje. ;) Použil jsem vyhledávání zde i na google.
A teď k problému - na intranetu bych do určité aplikace chtěl udělat automatické přihlašování. Není třeba nutit uživatele, aby se přihlásili do Windows a pak ještě do aplikace. Firma, pro kterou pracuji, využívá active directory, zmiňovaná aplikace běží na IIS7 na bázi PHP, nicméně zde fungují i aspx soubory. Bohužel já asp vůbec neumím, ale napadlo mě, že by možná přes něj šlo získat údaje o uživateli, např. že by ho aplikace získala přes ajax. Zjistit přihlášeného uživatele jsem zkoušel i přes js, opět nic. Vím, že je to silně amatérské, vím, že to možná nějak souvisí s LDAP (opět nový termín pro mě), ale velmi bych ocenil, kdybyste mě nakopli, kam dál. Díky moc! |
||
Časová prodleva: 5 dní
|
|||
Enko Profil |
Jsou dvě řešení. Kažedé más vé výhody a nevýhody.
První řešení je možné pouze v případě, že máte striktně zavedené používání IE, ve výchozím nastavení stačí. A můžeš pro případy například přes GPO zakázat měnit určitá nastavení. Konkrétně aby si uživatelé vypli možnost NTLM autentizace. Ale s tímto jsem se za několikaletou praxi nesetkal :-) Při této variantě si PHP skript vezme z hlaviček IE informaci o přihlášeném uživateli do IE, se kterým pak můžeš pracovat. Viz tento odkaz: http://siphon9.net/loune/2007/10/simple-lightweight-ntlm-in-php/ Ovšem zde nedochází ke skutečnému zjišťování, zda je uživatel v pořádku vůči AD, atd... Prostě jenom vezmeš z hlaviček název uživatele/počítače nebo domény. Druhým řešením je možnost skutečné autentizace vůči AD, a na to si musíš zprovoznit LDAP (ideálně však LDAPS, aby ti nelítali hesla po síti v plaintextu) k AD a až to budeš mít, tak můžeš využívat skutečné ověření vůči AD. Zde posílám celé řešení, včetně přihlašovacího formuláře a ošetření proti Injection útoku: <?php //funkce na overeni uzivatelskeho prihlase do AD function authUserAD($username, $password, $DomainName="domena.local", $ldap_server="ldap://192.168.1.2") { $auth_user = $username."@".$DomainName; if($connect = ldap_connect($ldap_server)){ ldap_set_option($connect, LDAP_OPT_PROTOCOL_VERSION, 3); ldap_set_option($connect, LDAP_OPT_REFERRALS, 0); if(ldap_bind($connect, $auth_user, $password)) { ldap_close($connect); return(true); } } ldap_close($connect); return(false); } //funkce na vycisteni vstupu do LDAP /** * function ldap_escape * @author Chris Wright * @version 2.0 * @param string $subject The subject string * @param bool $dn Treat subject as a DN if TRUE * @param string|array $ignore Set of characters to leave untouched * @return string The escaped string */ function ldap_escape ($subject, $dn = TRUE, $ignore = NULL) { // The base array of characters to escape // Flip to keys for easy use of unset() $search = array_flip($dn ? array('\\', ',', '=', '+', '<', '>', ';', '"', '#') : array('\\', '*', '(', ')', "\x00")); // Process characters to ignore if (is_array($ignore)) { $ignore = array_values($ignore); } for ($char = 0; isset($ignore[$char]); $char++) { unset($search[$ignore[$char]]); } // Flip $search back to values and build $replace array $search = array_keys($search); $replace = array(); foreach ($search as $char) { $replace[] = sprintf('\\%02x', ord($char)); } // Do the main replacement $result = str_replace($search, $replace, $subject); // Encode leading/trailing spaces in DN values if ($dn) { if ($result[0] == ' ') { $result = '\\20'.substr($result, 1); } if ($result[strlen($result) - 1] == ' ') { $result = substr($result, 0, -1).'\\20'; } } return $result; } //jdeme zpracovat if($_SERVER["REQUEST_METHOD"] == "POST"){ //kontrola vyplnenosti vstupnich poli if(empty($_POST["username"])){$chyba[] = "<p class=\"error\">Vyplňte uživatelské jméno.</p>";} if(empty($_POST["password"])){$chyba[] = "<p class=\"error\">Vyplňte heslo.</p>";} //vypsani chyb ze vstupnich poli, pokud nejake jsou if(is_array($chyba)){ foreach($chyba as $value){ echo $value; } } //ulozit data do databaze a nahrat obrazek else{ //osetreni vstupu proti LDAP Injection a odstraneni mezer $username = ldap_escape(trim($_POST["username"])); $password = ldap_escape(trim($_POST["password"])); //jdeme se prihlasit if(authUserAD($username, $password)){ echo "Přihlášení je OK"; } else{ echo "Přihlášení selhalo"; } } } ?> <table> <form action="" method="POST"> <tr> <td><label for="username">Uživatelské jméno: </label></td> <td><input id="username" type="text" name="username" size="30" maxlength="99" value="<?php if(isset($_POST["username"])){echo htmlspecialchars($_POST["username"]);} ?>"/></td> </tr> <tr> <td><label for="password">Heslo: </label></td> <td><input id="password" type="password" name="password" size="30" maxlength="99"/></td> </tr> <tr> <td> </td> <td><input type="submit" name="submit" value=" Přihlásit " /></td> </tr> </form> </table> |
||
Časová prodleva: 10 let
|
0