Saya memiliki situs intranet yang telah saya bangun, yang memiliki sistem login sendiri (pengguna mendaftar sebagai pengguna baru, dan menggunakan nama pengguna/kata sandi yang ada di sana untuk login ke situs). Namun, sekarang saya ingin memperluasnya, dan membuat situs intranet menggunakan ActiveDirectory yang ada untuk otentikasi. Inilah yang saya cari, ke depannya -
Ketika pengguna mengakses situs intranet ini (http://intranetsite/mySite
), kredensial domain pengguna divalidasi terhadap direktori aktif, dan jika kredensial pengguna cocok dengan AD, pengguna kemudian disajikan halaman utama situs intranet.
Saya baru mengenal AD, dan tidak tahu bagaimana cara melakukan konfigurasi ini. Situs intranet saya dibangun dengan PHP dan menggunakan Apache pada server aplikasi; AD berada pada server IIS yang berbeda.
Informasi apa yang saya perlukan, dan di mana saya harus menaruh informasi ini (ke dalam situs saya? htaccess? di mana saja?) sehingga saya dapat menggunakan autentikasi AD? Apakah hanya ' konfigurasi ' cukup, atau apakah saya perlu menulis kode PHP eksplisit untuk otentikasi ini?
Setiap petunjuk sangat dihargai.
Jika Anda hanya mencari otentikasi dan tidak ada yang lain, Anda mungkin bisa lolos hanya dengan beberapa baris kode.
Pertama, pastikan Anda memiliki ldap enabled di php Anda.
Berikut implementasi php murni:
(perhatikan bahwa ketika melakukannya dengan cara ini, Anda harus memastikan bahwa Anda MEMILIKI nama pengguna dan kata sandi dari pengguna - pengikatan anonim hampir selalu akan mengembalikan true untuk 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, '[email protected]', 'SomeSecret')) {
// Invalid credentials! Handle error appropriately
}
// Bind was successful - continue
Jika Anda berharap untuk melakukan hal-hal yang lebih menyenangkan dengan Active Directory seperti menarik beberapa informasi tentang pengguna yang saat ini masuk, saya sangat menyarankan menggunakan kerangka kerja untuk melakukan pekerjaan berat untuk Anda. Seperti yang telah disebutkan, adLDAP adalah salah satu yang bagus dan jika Anda menjalankan PHP 5.4 saya berani merekomendasikan library AD-X yang saya kembangkan secara aktif (Anda dapat menginstalnya melalui Composer).
Dengan pustaka AD-X, Anda dapat memverifikasi kredensial pengguna menggunakan kode ini:
try {
$link = new ADX\Core\Link('domain.com'); // Establish connection to AD
$link->bind('[email protected]', '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
Jangan ragu untuk memilih mana yang paling cocok untuk Anda. Namun, jika Anda berharap untuk melakukan lebih dari sekedar mengotentikasi, saya sangat menyarankan Anda menggunakan library untuk pekerjaan ldap - ini akan menghemat banyak waktu dan mungkin frustasi ketika hal-hal yang tidak bekerja seperti yang Anda harapkan.
Juga, jika ragu informasi apa yang dapat/harus Anda gunakan untuk menghubungkan dan mengotentikasi, silakan periksa jawaban saya sebelumnya pada topik ini.
Inilah yang saya gunakan:
<?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>