validar usuario single password obtener datos crear conectar con active c# active-directory

usuario - single sign on c# active directory



Encontrar un usuario en Active Directory con el nombre de inicio de sesiĆ³n (3)

Gracias. Pensé que podía obtener el dominio (al menos en mi AD) especificando "LDAP: // {0} .somedomain.com / DC = {0}, DC = somedomain, DC = com", reemplazando {0} con el dominio, que funciona en nuestro entorno, al menos.

Una pregunta sin embargo: sAMAccountName parece depreciado: el nombre de inicio de sesión utilizado para admitir clientes y servidores que ejecutan versiones anteriores del sistema operativo, como Windows NT 4.0, Windows 95, Windows 98 y LAN Manager. Este atributo debe tener menos de 20 caracteres para admitir clientes más antiguos.

¿Sigue siendo este el mejor enfoque? ¿O hay un campo más "moderno" para consultar? (Windows 2003 Active Directory, Windows XP o 2003 Clientes, .net 3.0)

Editar: Gracias de nuevo. Nuestra estructura es un poco complicada: tenemos un gran bosque "domain.com", con varios dominios para oficinas regionales. Esencialmente: el inicio de sesión es "algo / nombre de usuario", el dominio completo es algo.dominio.com y el correo es [email protected] (sin el algo), pero el nombre principal es [email protected]. Voy a "traducir" manualmente algo / username a [email protected], ya que esta parece ser la forma más robusta. Especialmente porque quiero mantener la característica Auto-Discovery.

Posiblemente soy estúpido, pero estoy tratando de encontrar un usuario en Active Directory desde C #, usando el nombre de usuario ("dominio / usuario").

Mi Funcionalidad de búsqueda AD "Esqueleto" se ve así:

de = new DirectoryEntry(string.Format("LDAP://{0}", ADSearchBase), null, null, AuthenticationTypes.Secure); ds = new DirectorySearcher(de); ds.SearchScope = SearchScope.Subtree; ds.PropertiesToLoad.Add("directReports"); ds.PageSize = 10; ds.ServerPageTimeLimit = TimeSpan.FromSeconds(2); SearchResult sr = ds.FindOne();

Ahora, eso funciona si tengo el DN completo del usuario (ADSearchBase generalmente apunta a la unidad organizativa "Nuestros usuarios" en Active Directory), pero simplemente no tengo idea de cómo buscar un usuario según la sintaxis "dominio / usuario" .

¿Alguna sugerencia?


Nombre de inicio de sesión (Pre-Windows 2000)

"(&(objectCategory=person)(objectClass=user)(!sAMAccountType=805306370)(sAMAccountName=John))"

Nombre de inicio de sesión (Windows 2000 y superior)

"(&(objectCategory=person)(objectClass=user)(!sAMAccountType=805306370)(userPrincipalName=John))"


Necesita establecer un filtro (DirectorySearcher.Filter) algo así como:

"(& (objectCategory = person) (objectClass = user) (sAMAccountName = {0}))"

Tenga en cuenta que solo especifica el nombre de usuario (sin el dominio) para la propiedad sAMAccountName. Para buscar dominio / usuario, primero busque el contexto de denominación para el dominio requerido, luego busque allí sAMAccountName.

Por cierto, al construir cadenas de consulta LDAP usando String.Format, generalmente debe tener cuidado de escapar de cualquier carácter especial. Probablemente no sea necesario para un nombre de cuenta, pero podría serlo si está buscando otras propiedades, como el primer nombre del usuario (propiedad givenName) o el apellido (propiedad sn). Tengo un método de utilidad EscapeFilterLiteral para hacer esto: construyes tu cadena así:

String.Format("(&(objectCategory=person)(objectClass=user)(sn={0}))", EscapeFilterLiteral(lastName, false));

donde EscapeFilterLiteral se implementa de la siguiente manera:

public static string EscapeFilterLiteral(string literal, bool escapeWildcards) { if (literal == null) throw new ArgumentNullException("literal"); literal = literal.Replace("//", "//5c"); literal = literal.Replace("(", "//28"); literal = literal.Replace(")", "//29"); literal = literal.Replace("/0", "//00"); literal = literal.Replace("/", "//2f"); if (escapeWildcards) literal = literal.Replace("*", "//2a"); return literal; }

Esta implementación le permite tratar el carácter * como parte del literal (escapeWildcard = true) o como un carácter comodín (escapeWildcard = false).

ACTUALIZACIÓN: Esto no tiene nada que ver con su pregunta, pero el ejemplo que publicó no llama a Dispose sobre los objetos desechables que utiliza. Al igual que todos los objetos desechables, estos objetos (DirectoryEntry, DirectorySearcher, SearchResultCollection) siempre deben desecharse, normalmente con la instrucción using. Vea esta publicación para más información.