2014-10-09 51 views
0

我想写一个基本的PHP脚本连接到我的AD LDS实例和身份验证用户,但我登录失败。该脚本是:php登录失败使用AD LDS

<?php 
include("authenticate.php"); 

// check to see if user is logging out 
if(isset($_GET['out'])) { 
    // destroy session 
    session_unset(); 
    $_SESSION = array(); 
    unset($_SESSION['user'],$_SESSION['access']); 
    session_destroy(); 
} 

// check to see if login form has been submitted 
if(isset($_POST['userLogin'])){ 
    // run information through authenticator 
    if(authenticate($_POST['userLogin'],$_POST['userPassword'])) 
    { 
     // authentication passed 
     header("Location: success.php"); 
     die(); 
    } else { 
     // authentication failed 
     $error = 1; 
    } 
} 

// output error to user 
if (isset($error)) echo "Login failed: Incorrect user name, password, or rights<br /-->"; 

// output logout success 
if (isset($_GET['out'])) echo "Logout successful"; 
?> 

<form action="login.php" method="post"> 
    User: <input type="text" name="userLogin" /><br /> 
    Password: <input type="password" name="userPassword" /> 
    <input type="submit" name="submit" value="Submit" /> 
</form> 

的authenticate功能如下: 为ldap_dn和ldap_host,我已经把这些值用于活动目录的distinguised名和分别AD LDS服务器的主要实例。

function authenticate($user, $password) { 
    // Active Directory server 
    $ldap_host = "server"; 

    // Active Directory DN 
    $ldap_dn = "O=mycompany,C=US"; 

    // connect to active directory 
    $ldap = ldap_connect($ldap_host); 

    // verify user and password 
    if($bind = @ldap_bind($ldap, $user, $password)) { 
     // valid 
     echo "<script>alert('valid');</script>"; 
     // check presence in groups 
     $filter = "(userPrincipalName=" . $user . ")"; 
     $attr = array("memberof"); 
     $result = ldap_search($ldap, $ldap_dn, $filter, $attr) or exit("Unable to search LDAP server"); 
     $entries = ldap_get_entries($ldap, $result); 
     ldap_unbind($ldap); 
if($result){ 
      $_SESSION['user'] = $user; 
      return true; 
     } 
     else{ 
      return false; 
     } 

    } else { 
     // invalid name or password 
     return false; 
    } 
    if($ldap) 
     return true; 
    else 
     return false; 
} 

我仍然登录失败。我是否错误地设置了ldap主机或ldap_dn?如果是的话,我需要设置什么值?

回答

0

据我所知ldap_bind预计给定的用户名是一个DN。你只是简单地提供一个用户名。我怀疑这是否有效。

当我在做LDAP-Logins时,我总是做一个firt绑定,使用匿名绑定或专用用户帐户从用户名中获取DN,并且一旦有DN,我就使用第二个绑定刚才检索的DN和提供的密码。这总是像一个魅力。正如我可以为自己定义我在搜索DN时使用的属性,我可以使用任何(唯一的)attriute来登录。

我创建了一个little gist来显示基本概念。