programing

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

sourcetip 2022. 10. 18. 22:41
반응형

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

PHP(Active Directory가 프로바이더)를 사용하여 LDAP를 통해 사용자를 인증하는 방법을 찾고 있습니다.IIS 7에서 실행할 수 있는 것이 이상적입니다(adLDAP은 Apache에서 실행합니다).비슷한 일을 해 본 사람이 있나요?

  • 편집: 바로 사용할 수 있는 코드가 있는 라이브러리/클래스를 원합니다.바퀴를 발명하는 것은 어리석은 일이다.

기본적으로 두 줄의 코드만 있으면 라이브러리 전체를 Import하는 것은 비효율적인 것 같습니다.

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

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

  • 입력의 유효성을 확인해야 합니다.그렇지 않으면 빈 사용자 이름/비밀번호가 전달됩니다.
  • 바인딩 시 사용자 이름/비밀번호가 올바르게 인코딩되어 있는지 확인해야 합니다.
  • TLS를 사용하여 연결을 암호화해야 합니다.
  • 1대의 LDAP 서버가 다운되었을 경우의 용장성을 위해 다른 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).
  • 1대의 LDAP 서버가 다운되어 있는 경우는, 다른 LDAP 서버를 사용해 주세요.
  • TLS를 사용하여 인증 요청을 암호화합니다.
  • 실패한 경우 추가 정보를 제공합니다(예:잠긴/비활성화된 계정 등)

이를 위한 다른 라이브러리(Adldap2 등)도 있습니다.다만, 가장 많이 투표된 답변은 실제로는 입력 검증을 하지 않고 TLS를 사용하지 않는 보안상의 리스크이기 때문에, 몇 가지 추가 정보를 제공할 수 밖에 없다고 느꼈습니다.

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

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

계정이 LDAP에 바인딩할 수 있는 경우 계정이 유효하고 바인딩할 수 없는 경우 계정이 유효하지 않습니다.인증(계정 관리가 아님)만 하고 있다면 라이브러리는 필요 없습니다.

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

PHP에는 라이브러리가 있습니다.http://ca.php.net/ldap

PEAR 에는, http://pear.php.net/search.php?q=ldap&in=packages&x=0&y=0 와 같은 다수의 패키지도 있습니다.

저도 써본 적은 없지만, 어느 순간 써보려고 했더니 일을 해야 할 것 같더라고요.

완전한 예를 찾고 계신 분은, http://www.exchangecore.com/blog/how-use-ldap-active-directory-authentication-php/ 를 참조해 주세요.

Windows Server 2003 Web Server(IIS6) 및 IIS 8을 실행하고 있는 Windows Server 2012 엔터프라이즈에서 Windows Server 2003 및 Windows Server 2008 R2 도메인 컨트롤러에 대한 연결을 테스트했습니다.

언급URL : https://stackoverflow.com/questions/171519/authenticating-in-php-using-ldap-through-active-directory

반응형