자체 로그인 시스템(사용자가 새 사용자로 등록하고 여기에 있는 사용자 이름/비밀번호를 사용하여 사이트에 로그인)이 있는 <인트라넷> 사이트를 구축했습니다. 그러나 이제는이를 확장하고 인트라넷 사이트에서 기존 ActiveDirectory를 인증에 사용하도록하고 싶습니다. 앞으로 제가 찾고 있는 것은 다음과 같습니다.
사용자가이 인트라넷 사이트 (http://intranetsite/mySite
)에 액세스하면 사용자의 도메인 자격 증명이 활성 디렉토리에 대해 유효성이 검사되고 사용자의 자격 증명이 AD와 일치하면 사용자에게 인트라넷 사이트의 기본 페이지가 표시됩니다.
AD를 처음 사용하는데 이 구성을 수행하는 방법을 모릅니다. 제 인트라넷 사이트는 PHP를 기반으로 구축되었으며 애플리케이션 서버에서 Apache를 사용하지만 AD는 다른 IIS 서버에 있습니다.
AD 인증을 사용하려면 어떤 정보가 필요하며 이 정보를 어디에 넣어야 하나요(내 사이트? htaccess? 다른 곳?)? 설정만으로 충분한가요, 아니면 이 인증을 위해 명시적인 PHP 코드를 작성해야 하나요?
어떤 조언이라도 감사하겠습니다.
인증만 필요한 경우라면 몇 줄의 코드만으로 충분할 수 있습니다.
먼저, PHP에 ldap 활성화가 설정되어 있는지 확인합니다.
다음은 순수한 PHP 구현입니다; (이 방법을 사용할 때는 사용자의 사용자 이름과 비밀번호가 있는지 확인해야 합니다. 익명 바인딩은 거의 항상 AD에 대해 true를 반환합니다).
$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
현재 로그인한 사용자에 대한 정보를 가져오는 것과 같이 Active Directory로 더 재미있는 작업을 수행하려는 경우 프레임워크를 사용하여 무거운 작업을 수행할 것을 강력히 권장합니다. 이미 언급했듯이 adLDAP는 좋은 프레임워크이며 PHP 5.4를 실행하는 경우 제가 적극적으로 개발하는 AD-X 라이브러리를 감히 추천합니다(컴포저를 통해 설치할 수 있습니다).
AD-X 라이브러리를 사용하면 이 코드를 사용하여 사용자의 자격 증명을 확인할 수 있습니다:
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
자신에게 가장 적합한 것을 자유롭게 선택하세요. 그러나 인증 이상의 기능을 기대하는 경우에는 라이브러리를 사용하여 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>