Active Directory를 통해 LDAP를 사용하여 PHP에서 인증


104

PHP로 LDAP를 통해 사용자를 인증하는 방법을 찾고 있습니다 (Active Directory가 공급자가 됨). 이상적으로는 IIS 7에서 실행할 수 있어야합니다 ( adLDAP 는 Apache에서 ). 비슷한 일을 성공한 사람이 있습니까?

  • 편집 : 준비된 코드가있는 라이브러리 / 클래스를 선호합니다 ... 누군가 이미 그렇게했을 때 바퀴를 발명하는 것은 어리석은 일입니다.

나는 드루팔이 thatr하기위한 모듈이 생각
redben

답변:


167

기본적으로 두 줄의 코드 만 있으면 전체 라이브러리를 가져 오는 것이 비효율적으로 보입니다.

$ldap = ldap_connect("ldap.example.com");
if ($bind = ldap_bind($ldap, $_POST['username'], $_POST['password'])) {
  // log them in!
} else {
  // error message
}

43
제공된 암호가 비어 있으면 일부 AD 설치가 성공적으로 바인딩됩니다. 조심하세요! 인증을 시도하기 전에 비어 있지 않은 암호를 확인해야 할 수 있습니다.
diolemo 2011 년

@diolemo 비밀번호가 비어 있는지 확인하지 않고이를 방지 할 수있는 방법이 있습니까?
Naftali aka Neal

@Neal ldap_set_option다른 방식으로 작동하도록하는 데 사용할 수 있습니다 . 프로토콜 버전을 설정하고 있습니까? 실험을해야합니다. 나는 개인적으로 안전을 위해 빈 암호를 확인하는 것이 좋습니다.
diolemo


익명의 편집자에게 : 아니요, 제가 아는 한, 입력 삭제는 ldap_bind처리와 같이 여기에서 필요하지 않으며 특수 문자는 문제가되지 않습니다.
ceejayoz

14

Active Directory에서 사용자를 인증하는 것은 라이브러리없이 PHP에서 LDAP를 사용하는 매우 간단한 프로세스라고 생각할 것입니다. 그러나 매우 빠르게 복잡하게 만들 수있는 많은 것들이 있습니다.

  • 입력을 확인해야합니다. 그렇지 않으면 빈 사용자 이름 / 암호가 전달됩니다.
  • 바인딩 할 때 사용자 이름 / 암호가 올바르게 인코딩되었는지 확인해야합니다.
  • TLS를 사용하여 연결을 암호화해야합니다.
  • 하나가 다운 된 경우 중복성을 위해 별도의 LDAP 서버를 사용합니다.
  • 인증이 실패하면 정보를 제공하는 오류 메시지를받습니다.

실제로 대부분의 경우 위를 지원하는 LDAP 라이브러리를 사용하는 것이 더 쉽습니다. 궁극적으로 위의 모든 사항을 처리하는 자체 라이브러리 인 LdapTools를 롤링하게되었습니다 (인증뿐만 아니라 훨씬 더 많은 작업을 수행 할 수 있음). 다음과 같이 사용할 수 있습니다.

use LdapTools\Configuration;
use LdapTools\DomainConfiguration;
use LdapTools\LdapManager;

$domain = (new DomainConfiguration('example.com'))
    ->setUsername('username') # A separate AD service account used by your app
    ->setPassword('password')
    ->setServers(['dc1', 'dc2', 'dc3'])
    ->setUseTls(true);
$config = new Configuration($domain);
$ldap = new LdapManager($config);

if (!$ldap->authenticate($username, $password, $message)) {
    echo "Error: $message";
} else {
    // Do something...
}

위의 인증 호출은 다음과 같습니다.

  • 사용자 이름이나 비밀번호가 비어 있지 않은지 확인합니다.
  • 사용자 이름 / 암호가 올바르게 인코딩되었는지 확인합니다 (기본적으로 UTF-8).
  • 하나가 다운 된 경우 대체 LDAP 서버를 사용해보십시오.
  • TLS를 사용하여 인증 요청을 암호화합니다.
  • 실패한 경우 추가 정보 제공 (예 : 잠긴 / 비활성화 된 계정 등)

이 작업을 수행 할 다른 라이브러리도 있습니다 (예 : Adldap2). 그러나 가장 찬성 된 답변은 실제로 입력 유효성 검사를 수행하지 않고 TLS를 사용하지 않고 의존 할 수있는 보안 위험이기 때문에 몇 가지 추가 정보를 제공 할 수밖에 없다고 느꼈습니다.


1
LDAP 연결의 경우 TLS가 더 이상 사용되지 않고 StartTLS ( openldap.org/faq/data/cache/605.html)가 사용 됩니다.
zenlord

2
@zenlord ldaps://연결 형식을 사용하는 것은 더 이상 사용되지 않습니다. 내 예 setUseTls(true)에서는 ldap://형식을 사용하고 ldap_start_tls($connection). 따라서 TLS 자체는 더 이상 사용되지 않는 것이 아니라 ldaps://(실제로 완전히 다른 포트를 통해 LDAP에 연결하는) 사용하여 연결 하는 것입니다.
ChadSikorra

12

사용자 자격 증명을 ldap_bind ()에 전달하기 만하면됩니다.

http://php.net/manual/en/function.ldap-bind.php

계정이 LDAP에 바인딩 할 수 있으면 유효한 것입니다. 할 수 없다면 그렇지 않습니다. 계정 관리가 아닌 인증 만하는 경우 라이브러리가 필요하지 않습니다.


9

저는 Zend_Ldap 클래스를 좋아합니다 . Zend 프레임 워크없이 프로젝트에서이 클래스 만 사용할 수 있습니다.


1
나는 인증하지 않는 것을 관리하기 위해 위의 구현 문제를 겪었습니다. 나는로 전환하려는 zend.auth.adapter.ldap
vdidxho


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.