Hola a todos.

Hoy les traigo algo que me estuvo dando Dolores de cabeza por un rato. Como loguear un usuario de tu dominio mediante LDAP. Que según una búsqueda en mi amigo google significa Lightweight Directory Access Protocol (en español Protocolo Ligero/Simplificado de Acceso a Directorios) que hacen referencia a un protocolo a nivel de aplicación que permite el acceso a un servicio de directorio ordenado y distribuido para buscar diversa información en un entorno de red. Bla bla bla ya esos conceptos lo pueden buscar ustedes. Así que vamos mejor al código que emplee en mi aplicación. Como se darán cuenta esta en c#.

//Cree una clase LdapAuthentication

public class LdapAuthentication
{
private string _path;
private string _filterAttribute;
public LdapAuthentication()
{
_path = "LDAP://dominio.algo.cu(en mi caso)";
}
/// <summary>
/// Este método me devuelve true o false en dependencia de si existe el  usuario y su contraseña coincide
/// </summary>
/// <param name="username">Nombre de Usuario</param>
/// <param name="pwd">Contraseña</param>
/// <returns></returns>
public bool IsAuthenticated(string username, string pwd)
{
string domainAndUsername = "NombredelDominio" + @"\" + username;
DirectoryEntry entry = new DirectoryEntry(_path, domainAndUsername, pwd);
try
{
DirectorySearcher search = new DirectorySearcher(entry) {Filter = "(SAMAccountName=" + username + ")"};
search.PropertiesToLoad.Add("cn");
SearchResult result = search.FindOne();
if (null == result)
{
return false;
}
_path = result.Path;
_filterAttribute = (string)result.Properties["cn"][0];
}
catch (Exception error)
{
//Lanzo una excepción como yo quiera
return false;
}
return true;
}

//este método solo lo uso para saber si el usuario existe en el directorio activo de mi servidor
public bool IsAuthenticated(string username)
{
DirectoryEntry entry = new DirectoryEntry(_path);
try
{
DirectorySearcher search = new DirectorySearcher(entry);
search.Filter = "(SAMAccountName=" + username + ")";
search.PropertiesToLoad.Add("cn");
SearchResult result = search.FindOne();
if (null == result)
{
return false;
}
_filterAttribute = (string)result.Properties["cn"][0];
}
catch (Exception error)
{
//Lanzo una excepción como yo quiera
return false;
}
return true;
}
}

//obtiene los grupos de tu directorio
public string GetGroups()
{
DirectorySearcher search = new DirectorySearcher(_path);
search.Filter = "(cn=" + _filterAttribute + ")";
search.PropertiesToLoad.Add("memberOf");
StringBuilder groupNames = new StringBuilder();
try
{
SearchResult result = search.FindOne();
int propertyCount = result.Properties["memberOf"].Count;
string dn;
int equalsIndex, commaIndex;
for (int propertyCounter = 0; propertyCounter < propertyCount; propertyCounter++)
{
dn = (string)result.Properties["memberOf"][propertyCounter];
equalsIndex = dn.IndexOf("=", 1, StringComparison.Ordinal);
commaIndex = dn.IndexOf(",", 1, StringComparison.Ordinal);
if (-1 == equalsIndex)
{
return null;
}
groupNames.Append(dn.Substring((equalsIndex + 1), (commaIndex - equalsIndex) - 1));
groupNames.Append("|");
}
}
catch (Exception error)
{
}
return groupNames.ToString();
}

///// <summary>
///// Etes obtiene el nombre completo del usuario a partir de su Nick
///// </summary>
///// <param name="username"></param>
///// <returns></returns>
public string GetFullnombre(string username)
{
DirectoryEntry entry = new DirectoryEntry(_path);
try
{
DirectorySearcher search = new DirectorySearcher(entry) { Filter = "(SAMAccountName=" + username + ")" };
search.PropertiesToLoad.Add("cn");
SearchResult result = search.FindOne();
if (null == result)
{
return "";
}
return result.Properties["CN"][0].ToString();
}
catch (Exception error)
{
//Lanzo una excepción como yo quiera
return "";
}
}
}

//Y luego en el botón de mi formulario del login pongo este código
var adAuth = new LdapAuthentication();
TextBox nomUsuario = (TextBox)LoginView1.FindControl("TextBoxUsuario");
TextBox contrasena = (TextBox)LoginView1.FindControl("TextBoxPass");
if (adAuth.IsAuthenticated(nomUsuario.Text, contrasena.Text))
{
string groups = adAuth.GetGroups();
FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(1, nomUsuario.Text, DateTime.Now, DateTime.Now.AddMinutes(480), false, groups);
string encryptedTicket = FormsAuthentication.Encrypt(authTicket);
HttpCookie authCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);
Response.Cookies.Add(authCookie);
FormsAuthentication.SetAuthCookie(nomUsuario.Text,false);
Server.Transfer("~/Default.aspx", false);
}
}

aunque si no se quieren complicar tanto simplemente pueden poner este

protected void Login1_Authenticate(object sender, AuthenticateEventArgs e)
{
var adAuth = new LdapAuthentication();
e.Authenticated = adAuth.IsAuthenticated(UserName, Password);
}

Espero que les sea útil.

Salu2

Anuncios