A autenticar-se no PHP usando o LDAP através da pasta activa

Estou à procura de uma forma de autenticar os utilizadores através do LDAP com o PHP (sendo o directório activo o fornecedor). Idealmente, ele deve ser capaz de executar em IIS 7 (adLDAP faz isso em Apache). Alguém tinha feito algo semelhante, com sucesso?

  • Edite: eu preferiria uma biblioteca / classe com código pronto para ir... Seria uma tolice inventar a roda quando alguém já o fez.
Author: GEOCHET, 2008-10-05

6 answers

Importar uma biblioteca inteira parece ineficiente quando só precisa de duas linhas de código...
$ldap = ldap_connect("ldap.example.com");
if ($bind = ldap_bind($ldap, $_POST['username'], $_POST['password'])) {
  // log them in!
} else {
  // error message
}
 152
Author: ceejayoz, 2014-01-08 21:33:39

Você pensaria que simplesmente autenticar um usuário em Diretório Ativo seria um processo bastante simples usando LDAP em PHP sem a necessidade de uma biblioteca. Mas há um monte de coisas que podem complicá-lo muito rápido:

  • tem de validar a entrada. Caso contrário, um utilizador/Senha vazios passar-se-ia.
  • deve assegurar que o nome de utilizador/Senha está devidamente codificado ao ligar.
  • você deve estar a cifrar a ligação com o TLS.
  • usando LDAP separado servidores para redundância no caso de um estar em baixo.
  • Obter uma mensagem de erro informativa se a autenticação falhar.

Na verdade é mais fácil na maioria dos casos usar uma biblioteca LDAP suportando o acima. Acabei por rebolar a minha própria biblioteca que lida com todos os pontos acima: LdapTools (bem, não só para Autenticação, pode fazer muito mais). Pode ser utilizado da seguinte forma:

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...
}

A chamada autenticada acima irá:

  • valide isso também não o utilizador ou senha está em branco.
  • Certifique-se que o utilizador/Senha está devidamente codificado (UTF-8 por omissão)
  • tenta um servidor LDAP alternativo no caso de um estar em baixo.
  • encriptar o pedido de autenticação com o TLS.
  • forneça informações adicionais se falhou (ie. conta bloqueada / desactivada, etc.

Existem outras bibliotecas para fazer isso também (como o Adldap2). No entanto, senti-me compelido o suficiente para fornecer algumas informações adicionais, uma vez que a resposta Mais votada é: na verdade, um risco de segurança para confiar sem nenhuma validação de entrada feita e não usando TLS.

 13
Author: ChadSikorra, 2016-04-18 01:29:04

Eu faço isso simplesmente passando as credenciais de usuário para ldap_bind ().

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

Se a conta pode ligar-se ao LDAP, é válida; se não pode, não é. Se tudo o que está a fazer é autenticação (não Gestão de contas), não vejo necessidade de uma biblioteca.

 11
Author: Scott Reynen, 2008-10-05 13:38:49

Gosto da classe Zend_Ldap, só pode usar esta classe no seu projecto, sem a estrutura Zend.

 8
Author: CMS, 2017-10-04 18:45:26

O PHP tem bibliotecas: http://ca.php.net/ldap

A pera também tem vários pacotes: http://pear.php.net/search.php?q=ldap&in=packages&x=0&y=0

Eu também não usei, mas ia fazê-lo a dada altura e eles pareciam que deviam trabalhar.
 6
Author: Darryl Hein, 2008-10-05 05:11:00

Para aqueles que procuram um exemplo completo confira http://www.exchangecore.com/blog/how-use-ldap-active-directory-authentication-php/.

Testei esta ligação tanto aos controladores de domínio R2 do Windows Server 2003 como aos do Windows Server 2008 a partir de um servidor Web do Windows Server 2003 (IIS6) e de uma empresa do windows server 2012 que executa o IIS 8.

 5
Author: Joe Meyer, 2014-01-08 19:09:39