2014-10-09 2 views
0

내 AD LDS 인스턴스에 연결하고 사용자를 인증하는 기본 PHP 스크립트를 작성하려고하지만 로그인에 실패했습니다. 스크립트는 다음과 같이PHP LDIF를 사용하여 로그인 실패

<?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> 

인증 용 기능은 다음 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를 수행 할 때 항상 익명 바인드 또는 전용 사용자 계정을 사용하여 사용자 이름에서 DN을 가져 오는 데 firt 바인드를 수행하고 DN이있는 즉시 두 번째 바인드를 사용합니다 방금 검색된 DN 및 제공된 비밀번호. 그것은 항상 매력처럼 작동합니다. 그리고 내가 DN을 검색 할 때 사용하는 속성을 스스로 정의 할 수 있기 때문에 로그인하는 데 필요한 고유 한 속성을 사용할 수 있습니다.

나는 기본 개념을 보여주기 위해 little gist을 만들었습니다.