2013-07-21 122 views
25

我有一个我创建的“内部网”网站,它具有自己的登录系统(用户注册为新用户,并使用用户名/密码登录到现场)。但是,现在我想扩展它,并让Intranet站点使用现有的ActiveDirectory进行身份验证。这是我正在寻找,向前 -使用Active Directory来验证内部网站上的用户

当用户访问此内部网站点(http://intranetsite/mySite)时,用户的域凭据根据活动目录进行验证,并且如果用户的凭据匹配AD,则会呈现该用户内部网站的主页。

我是AD新手,不知道如何去做这个配置。我的内部网站是围绕PHP构建的,并在应用程序服务器上使用Apache; AD位于不同的IIS服务器上。

我需要什么信息,以及我在哪里可以将这些信息(到我的网站?htaccess?其他地方?),以便我可以使用AD身份验证?仅仅'配置'就够了,还是我需要为这个认证书写明确的PHP代码?

任何指针非常感谢。

+0

[adLDAP(http://adldap.sourceforge.net)库可能对这个非常有帮助。 –

+0

您将要使用PHP的PHP库,并向您的AD管理员请求具有“只读”访问权限的帐户。 – DevlshOne

+0

让我知道你什么时候走得更远,我会很高兴地告诉你我设置了什么。 – DevlshOne

回答

19

如果您只是在寻找身份验证而没有其他任何东西,那么您只需要几行代码即可脱身。

首先,确保你的php中有ldap enabled

这里是纯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库(你可以通过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工作使用一个库 - 这会为您节省大量时间,并且可能会在您的工作无法正常工作时感到沮丧。

另外,如果有疑问,您可以/应该使用什么信息连接和验证,随时检查我的previous answer关于这个主题。

+0

尽管您确实演示了如何使用adLDAP连接并绑定到AD,但此代码包含了如此之多的高级代码,因此它有效地隐藏了提问者最感兴趣的部分代码。 – DevlshOne

+5

我的示例没有演示任何adLDAP。你认为哪一部分是先进的?你会如何推荐更新它?感谢您的解释。 –

+2

我如何自动登录用户?你的方法需要用户名和密码。我如何获得这些? – Somnium

6

下面是我用:

<?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> 
相关问题