У меня есть сайт «intranet», который я создал, у которого есть собственная система входа (пользователи регистрируются как новые пользователи и используют имя пользователя / пароль для входа на сайт). Тем не менее, теперь я хочу расширить его, а сайт интрасети использовать существующий ActiveDirectory для аутентификации. Это то, что я ищу, в будущем –
Когда пользователь получает доступ к этому сайту интрасети ( http://intranetsite/mySite
), учетные данные домена пользователя проверяются против активного каталога, а если учетные данные пользователя совпадают с AD, тогда пользователю предоставляется основная страница сайта интрасети.
Я новичок в AD и не знаю, как это сделать. Мой сайт интрасети построен вокруг PHP и использует Apache на сервере приложений; AD находится на другом сервере IIS.
Какая информация мне нужна, и где я помещаю эту информацию (на свой сайт? Htaccess? Где-нибудь еще?), Чтобы я мог использовать аутентификацию AD? Достаточно ли «конфигурации», или мне нужно написать явный PHP-код для этой проверки подлинности?
Любые указатели очень ценятся.
Если вы ищете только аутентификацию и ничего больше, вы можете обойтись всего несколькими строками кода.
Во-первых, убедитесь, что в вашем php включен ldap .
Вот чистая реализация php:
(обратите внимание, что при этом вы должны убедиться, что у вас есть имя пользователя и пароль от пользователя – анонимная привязка почти всегда возвращает true для AD)
$link = ldap_connect('domain.com'); // Your domain or domain server if(! $link) { // Could not connect to server - handle error appropriately } ldap_set_option($link, LDAP_OPT_PROTOCOL_VERSION, 3); // Recommended for AD // Now try to authenticate with credentials provided by user if (! ldap_bind($link, 'username@domain.com', 'SomeSecret')) { // Invalid credentials! Handle error appropriately } // Bind was successful - continue
Если вы ожидаете большего удовольствия от Active Directory, например, вытащить некоторую информацию о зарегистрированном в данный момент пользователе, я настоятельно рекомендую использовать фреймворк для тяжелой атлетики для вас. Как уже упоминалось, adLDAP является хорошим и если вы запускаете PHP 5.4, я осмеливаюсь рекомендовать библиотеку AD-X, которую я активно разрабатываю (вы можете установить ее через Composer).
С помощью библиотеки AD-X вы можете проверить учетные данные пользователя, используя этот код:
try { $link = new ADX\Core\Link('domain.com'); // Establish connection to AD $link->bind('username@domain.com', 'SomeSecret'); // Authenticate user } catch (ADX\Core\ServerUnreachableException $e) { // Unable to connect to server, handle error } catch (ADX\Core\InvalidCredentialsException $e) { // Invalid credentials supplied } catch (Exception $e) { // Something else happened, check the exception and handle appropriately } // Successfully authenticated if no exception has been thrown
Не стесняйтесь выбирать, который вам подходит. Однако, если вы ожидаете большего, чем аутентификации, я настоятельно рекомендую вам использовать библиотеку для работы ldap – это сэкономит вам много времени и, возможно, разочарование, когда все будет работать так, как вы ожидали бы от них.
Кроме того, если вы сомневаетесь, какую информацию вы можете использовать для подключения и аутентификации, не стесняйтесь проверить мой предыдущий ответ на эту тему.
Вот что я использую:
<?php error_reporting(E_ALL); ini_set('display_errors', 'On'); define('DOMAIN_FQDN', 'mycompany.intra'); define('LDAP_SERVER', '192.168.0.1'); if (isset($_POST['submit'])) { $user = strip_tags($_POST['username']) .'@'. DOMAIN_FQDN; $pass = stripslashes($_POST['password']); $conn = ldap_connect("ldap://". LDAP_SERVER ."/"); if (!$conn) $err = 'Could not connect to LDAP server'; else { define('LDAP_OPT_DIAGNOSTIC_MESSAGE', 0x0032); ldap_set_option($conn, LDAP_OPT_PROTOCOL_VERSION, 3); ldap_set_option($conn, LDAP_OPT_REFERRALS, 0); $bind = @ldap_bind($conn, $user, $pass); ldap_get_option($conn, LDAP_OPT_DIAGNOSTIC_MESSAGE, $extended_error); if (!empty($extended_error)) { $errno = explode(',', $extended_error); $errno = $errno[2]; $errno = explode(' ', $errno); $errno = $errno[2]; $errno = intval($errno); if ($errno == 532) $err = 'Unable to login: Password expired'; } elseif ($bind) { $base_dn = array("CN=Users,DC=". join(',DC=', explode('.', DOMAIN_FQDN)), "OU=Users,OU=People,DC=". join(',DC=', explode('.', DOMAIN_FQDN))); $result = ldap_search(array($conn,$conn), $base_dn, "(cn=*)"); if (!count($result)) $err = 'Unable to login: '. ldap_error($conn); else { foreach ($result as $res) { $info = ldap_get_entries($conn, $res); for ($i = 0; $i < $info['count']; $i++) { if (isset($info[$i]['userprincipalname']) AND strtolower($info[$i]['userprincipalname'][0]) == strtolower($user)) { session_start(); $username = explode('@', $user); $_SESSION['foo'] = 'bar'; // set session variables... break; } } } } } } // session OK, redirect to home page if (isset($_SESSION['foo'])) { header('Location: /'); exit(); } elseif (!isset($err)) $err = 'Unable to login: '. ldap_error($conn); ldap_close($conn); } ?> <!DOCTYPE html><head><title>Login</title></head> <style> * { font-family: Calibri, Tahoma, Arial, sans-serif; } .errmsg { color: red; } #loginbox { font-size: 12px; } </style> <body> <div align="center"><img id="imghdr" src="/img/logo.png" height="100" /><br><br><h2>Login</h2><br><br> <div style="margin:10px 0;"></div> <div title="Login" style="width:400px" id="loginbox"> <div style="padding:10px 0 10px 60px"> <form action="/login.php" id="login" method="post"> <table><?php if (isset($err)) echo '<tr><td colspan="2" class="errmsg">'. $err .'</td></tr>'; ?> <tr> <td>Login:</td> <td><input type="text" name="username" style="border: 1px solid #ccc;" autocomplete="off"/></td> </tr> <tr> <td>Password:</td> <td><input type="password" name="password" style="border: 1px solid #ccc;" autocomplete="off"/></td> </tr> </table> <input class="button" type="submit" name="submit" value="Login" /> </form> </div> </div> </div> </body></html>