Autenticando em PHP usando LDAP através do Active Directory
-
05-07-2019 - |
Pergunta
Eu estou procurando uma maneira de usuários autenticados através de LDAP com PHP (com o Active Directory ser o provedor). Idealmente, deve ser capaz de executar no IIS 7 ( adLDAP faz isso no Apache). Qualquer pessoa tinha feito nada semelhante, com sucesso?
- Editar:. Eu prefiro uma biblioteca / classe com o código que está pronto para ir ... Seria bobagem para inventar a roda quando alguém já o fez
Solução
A importação de uma biblioteca inteira parece ineficiente quando tudo que você precisa é essencialmente 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
}
Outras dicas
Você poderia pensar que simplesmente autenticar um usuário no Active Directory seria um processo bastante simples usando LDAP em PHP sem a necessidade de uma biblioteca. Mas há um monte de coisas que podem complicar-lo muito rápido:
- Você deve validar a entrada. Um nome de usuário / senha vazia passaria de outra forma.
- Você deve garantir que o nome de usuário / senha está devidamente codificado quando vinculativo.
- Você deve criptografar a conexão usando TLS.
- Usando servidores LDAP separadas para a redundância no caso de um é para baixo.
- Obter uma mensagem de erro informativo se a autenticação falhar.
É realmente mais fácil na maioria dos casos para usar uma biblioteca LDAP apoiar o acima. Eu finalmente acabou rolando minha própria biblioteca que lida com todos os pontos acima: LdapTools (Bem, não apenas para autenticação , ele pode fazer muito mais). Ele pode ser usado como o seguinte:
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 autenticar acima vontade:
- Validar que nem o nome de usuário ou senha está vazia.
- Verifique se o nome de usuário / senha está devidamente codificado (UTF-8 por padrão)
- Tente um servidor LDAP alternativo no caso de um é para baixo.
- Criptografar o pedido de autenticação usando TLS.
- Fornecer informações adicionais, caso tenha falhado (ie. Bloqueado conta / desativado, etc)
Existem outras bibliotecas para fazer isso também (Tais como Adldap2). No entanto, senti o suficiente para fornecer algumas informações adicionais como o mais up-votado resposta é realmente um risco de segurança de contar com sem validação de entrada feito e não usando TLS.
Eu faço isso simplesmente passando as credenciais do usuário para ldap_bind ().
http://php.net/manual/en/function.ldap- bind.php
Se a conta pode vincular a LDAP, é válido; se não puder, não é. Se tudo que você está fazendo é autenticação (não conta de gestão), não vejo a necessidade de uma biblioteca.
Eu gosto do Zend_Ldap Classe , você só pode usar essa classe em seu projeto, sem o Zend Framework.
PHP tem bibliotecas: http://ca.php.net/ldap
PERA também tem um número de pacotes: http: // pear.php.net/search.php?q=ldap&in=packages&x=0&y=0
Eu não usei qualquer um, mas eu estava indo para em um ponto e eles parecia que eles devem funcionar.
Para aqueles que procuram um exemplo completo confira http://www.exchangecore.com/blog/how-use-ldap-active-directory-authentication-php/ .
Eu testei esta conexão com o Windows Server 2003 e Windows Server 2008 controladores de domínio R2 de um Windows Server 2003 Web Server (IIS6) e de um Windows Server 2012 a empresa a executar o IIS 8.