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.
6 answers
$ldap = ldap_connect("ldap.example.com");
if ($bind = ldap_bind($ldap, $_POST['username'], $_POST['password'])) {
// log them in!
} else {
// error message
}
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.
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.
Gosto da classe Zend_Ldap, só pode usar esta classe no seu projecto, sem a estrutura Zend.
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.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.