Lightweight Directory Access Protocol (LDAP) é um protocolo de aplicação aberto e padrão de indústria para acessar e manter informações em um diretório distribuído. É um serviço de diretórios baseado no modelo cliente-servidor no qual os diretórios são disponibilizados em uma estrutura hierárquica para sistemas clientes, permitindo o compartilhamento de informações sobre usuários, sistemas, serviços e aplicações através da rede.
O LDAP geralmente é utilizado para armazenar usuários de uma empresa (intranet) ou de uma aplicação. Sua estrutura baseada em "árvore binária" não pode ser confundida com uma base de dados relacional como o SQL Server, Oracle, etc.
Há várias implementações do LDAP, a mais conhecida é o OpenLDAP no qual utilizei para testar o código deste artigo. A estrutura que usei para teste é a seguinte: minhaempresa -> parana -> curitiba -> users.
Código C# (CSharp)
No final do artigo teremos uma classe completa para conectar, inserir, excluir e pesquisar registros ou usuários no LDAP. Ao criar seu projeto no Visual Studio (utilizei a versão asp.net 4.0 neste caso) você precisa fazer referência do System.DirectoryServices.Protocols e utilizar os seguintes namespaces:
using System;
using System.DirectoryServices.Protocols;
using System.Net;
using System.Security.Cryptography;
using System.Text;
Propriedades com os dados do LDAP
Lembre-se que as propriedades abaixo devem ser alteradas conforme o seu ambiente.
private static string LdapServidor
{
get { return "192.168.0.100"; }
}
private static int LdapPorta
{
get { return 389; }
}
private static string LdapUsuario
{
get { return "cn=admin,dc=minhaempresa"; }
}
private static string LdapSenha
{
get { return "minha-senha-do-ldap"; }
}
private static string LdapBase
{
get { return "dc=curitiba,dc=parana,dc=minhaempresa"; }
}
private static string LdapUnidadeOrganizacional
{
get { return "ou=users,dc=curitiba,dc=parana,dc=minhaempresa"; }
}
private static string[] LdapObjectClass
{
get { return new string[] { "top", "inetOrgPerson", "person" }; }
}
Conectar no LDAP em C#
"EnviarRequisicaoLdap" é nossa função de conexão com o LDAP e será utilizada por todas as outras funções de inserir, excluir e pesquisar usuário (por isso deixei private).
private static DirectoryResponse EnviarRequisicaoLdap(DirectoryRequest request)
{
LdapConnection ldapConexao = new LdapConnection(new LdapDirectoryIdentifier(LdapServidor, LdapPorta));
try
{
// Tipo de autenticação com o LDAP
ldapConexao.AuthType = AuthType.Basic;
// Envia as credenciais com o dn completo
NetworkCredential credenciais = new NetworkCredential(LdapUsuario, LdapSenha);
// Estabele a conexão com o LDAP
ldapConexao.Bind(credenciais);
// Envia a requisição ao LDAP
return ldapConexao.SendRequest(request);
}
finally
{
// Libera a conexão com o LDAP.
if (ldapConexao != null)
ldapConexao.Dispose();
}
}
Inserir usuário no LDAP em C#
No meu caso o uid é o email, mas você pode utilizar conforme sua estrutura LDAP, como um código ou um login. A classe Usuario utilizada abaixo deve ser construída conforme sua necessidade.
public static bool IncluirUsuario(Usuario usuario)
{
if (usuario != null)
{
string dn = string.Format("uid={0},{1}", usuario.Email, LdapUnidadeOrganizacional);
AddRequest addRequest = new AddRequest(dn);
addRequest.Attributes.AddRange(new DirectoryAttributeCollection() {
new DirectoryAttribute("objectClass", LdapObjectClass),
new DirectoryAttribute("uid", usuario.Email),
new DirectoryAttribute("cn", usuario.Nome),
new DirectoryAttribute("sn", usuario.Sobrenome),
new DirectoryAttribute("userPassword", ConverterSenhaLdapMD5(usuario.Senha)),
});
// Acessando o LDAP
EnviarRequisicaoLdap(addRequest);
return true;
}
return false;
}
Gerar senha MD5 no LDAP em C#
public static string ConverterSenhaLdapMD5(string senha)
{
MD5 md5 = new MD5CryptoServiceProvider();
string criptografada = Convert.ToBase64String(md5.ComputeHash(ASCIIEncoding.Default.GetBytes(senha)));
return "{MD5}" + criptografada;
}
Alterar usuário no LDAP em C#
Na função abaixo a alteração foi feita apenas no atributo senha (userPassword) do usuário, mas você pode alterar qualquer atributo.
public static bool AlterarSenhaUsuario(Usuario usuario)
{
if (usuario != null)
{
string dn = string.Format("uid={0},{1}", usuario.Email, LdapUnidadeOrganizacional);
ModifyRequest modifyRequest = new ModifyRequest();
modifyRequest.DistinguishedName = dn;
DirectoryAttributeModification atributoSenha = new DirectoryAttributeModification();
atributoSenha.Operation = DirectoryAttributeOperation.Replace;
atributoSenha.Name = "userPassword";
atributoSenha.Add(ConverterSenhaLdapMD5(usuario.Senha));
// Adiciona os atributos na requisição
modifyRequest.Modifications.Add(atributoSenha);
// Acessando o LDAP
EnviarRequisicaoLdap(modifyRequest);
return true;
}
return false;
}
Excluir usuário no LDAP em C#
public static bool ExcluirUsuario(string email)
{
if (!string.IsNullOrWhiteSpace(email))
{
string dn = string.Format("uid={0},{1}", email, LdapUnidadeOrganizacional);
DeleteRequest deleteRequest = new DeleteRequest();
deleteRequest.DistinguishedName = dn;
// Acessando o LDAP
EnviarRequisicaoLdap(deleteRequest);
return true;
}
return false;
}
Pesquisar usuário no LDAP em C#
Neste caso é feita a pesquisa do usuário por email e a recuperação dos atributos e valores.
public static Usuario ListarUsuario(string email)
{
if (!string.IsNullOrWhiteSpace(email))
{
string dn = string.Format("uid={0},{1}", email, LdapUnidadeOrganizacional);
SearchRequest searchRequest = new SearchRequest();
searchRequest.DistinguishedName = dn;
// Acessando o LDAP
SearchResponse response = (SearchResponse)EnviarRequisicaoLdap(searchRequest);
if (response != null)
{
if (response.Entries.Count > 0)
{
SearchResultEntry resultadoLdap = response.Entries[0];
Usuario usuario = new Usuario();
usuario.Nome = resultadoLdap.Attributes["cn"][0].ToString();
usuario.Sobrenome = resultadoLdap.Attributes["sn"][0].ToString();
usuario.Email = resultadoLdap.Attributes["uid"][0].ToString();
usuario.Senha = resultadoLdap.Attributes["userPassword"][0].ToString();
// Retorna o usuário preenchido
return usuario;
}
}
}
return null;
}
Classe completa para acesso ao LDAP em C#
Segue a solução completa (incluído a classe Usuario) para conectar no LDAP em C#. Basta utilizar os métodos públicos.
Até o próximo artigo!