私が構築した 'intranet' サイトは、独自のログインシステムを持っています(ユーザーは新規ユーザーとして登録し、サイトへのログインにユーザー名/パスワードを使用します)。しかし、今、私はそれを拡張し、イントラネットサイトが認証のために既存のActiveDirectoryを使用するようにしたいです。これが、私が求めているものです。
ユーザーがこのイントラネットサイト(http://intranetsite/mySite
)にアクセスすると、ユーザーのドメイン認証情報がアクティブディレクトリに対して検証され、ユーザーの認証情報がADと一致すれば、ユーザーにイントラネットサイトのメインページが表示されます。
私はADの初心者で、この設定についてどうすればいいのかわかりません。私のイントラネットサイトはPHPで構築されており、アプリケーションサーバーにApacheを使用しています。
AD認証を利用するためには、どのような情報が必要で、その情報をどこに書けばよいのでしょうか(サイト内かhtaccessか、他のどこかか)。それとも、この認証のために明示的にPHPコードを書く必要があるのでしょうか?
何かご指摘があれば、ぜひお願いします。
認証だけを目的とし、それ以外は何もしないのであれば、数行のコードで済むかもしれません。
まず、phpでldapが有効になっていることを確認してください。
ここでは、純粋なphpの実装を紹介します: <br>; (この方法で行う場合、ユーザー名とパスワードがあることを確認する必要があることに注意してください。)
$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 ライブラリをお勧めします(Composerからインストールできます)。
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の作業にはライブラリを使うことを強くお勧めします - 多くの時間を節約できますし、期待通りに動作しないときにイライラすることもあるかもしれません。
また、接続や認証にどのような情報を使用すればよいかわからない場合は、このトピックに関する私の[前回の回答]3を参照してください。
私が使っているのはこちらです:
<?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>