Skip to main content

Conectar, pesquisar e inserir usuários no LDAP em C#

Saiba como conectar em uma base LDAP em C# (CSharp) para incluir, alterar, excluir e pesquisar usuários de maneira nativa


ldap

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!

publicado por Mauricio Hernaski