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.