validar usuario password example active c# authentication identity adsi

example - validar usuario y password active directory c#



Nombre completo en lugar del ID del dominio en User.Identity.Name (5)

La interfaz de IIdentity es la que proporciona la propiedad Name en User.Identity. La interfaz de IIdentity se puede implementar en cualquier cantidad de clases que sepan cómo buscar usuarios desde un data-store (SQL Server, Active Directory, etc.).

No hay propiedad de la interfaz de IIdentity que proporciona "John Doe". Si esa información está ubicada en su data-store, necesitará usar las herramientas específicas de esa data-store para acceder a ella.

Dicho esto, es muy posible que el objeto que devuelve User.Identity tenga una propiedad que contenga "John Doe" a la que pueda acceder a través de otra interfaz además de IIdentity (nuestra implementación personalizada de IIdentity lo hace, por ejemplo).

La propiedad User.Identity.Name devuelve el ID de inicio de sesión del dominio.

¿Qué clase / propiedad expone el nombre de usuario real?

Para el usuario "John Doe" que inicia sesión en la aplicación web que proporciona my_domain / jdoe

**User.Identity.Name -** Returns : *my_domain/jdoe* **System.Environment.UserName** Returns: *jdoe*

¿Qué clase / propiedad devuelve? ... "John Doe"


Parece que en lugar del nombre de inicio de sesión, busca el nombre para mostrar de una cuenta de usuario de Active Directory. Lo que podría querer hacer es hacer una búsqueda de AD (DirectorySearcher) y obtener el nombre de visualización de la propiedad del resultado de la búsqueda.

Supongo que está en un entorno de AD, ya que etiquetó la pregunta adsi.

Nota: Si está trabajando con .NET 3.5, es posible que desee consultar la publicación de tvanfosson.


using System.DirectoryServices; public static string GetFullName(string strLogin) { string str = ""; string strDomain; string strName; // Parse the string to check if domain name is present. int idx = strLogin.IndexOf(''//'); if (idx == -1) { idx = strLogin.IndexOf(''@''); } if (idx != -1) { strDomain = strLogin.Substring(0, idx); strName = strLogin.Substring(idx + 1); } else { strDomain = Environment.MachineName; strName = strLogin; } DirectoryEntry obDirEntry = null; try { obDirEntry = new DirectoryEntry("WinNT://" + strDomain + "/" + strName); System.DirectoryServices.PropertyCollection coll = obDirEntry.Properties; object obVal = coll["FullName"].Value; str = obVal.ToString(); } catch (Exception ex) { str = ex.Message; } return str; }

y el puede simplemente llamar

var strJonDoeName = GetFullName(User.Identity.Name)

código burlarse de aquí


Si está pensando en el Directorio Activo, necesitará encontrar el UserPrincipal que corresponde al samAccountName dado y obtener la propiedad DisplayName de él. Tenga en cuenta que puede no estar configurado.

string fullName = null; using (PrincipalContext context = new PrincipalContext( ContextType.Domain )) { using (UserPrincipal user = UserPrincipal.FindByIdentity( context, User.Identity.Name )) { if (user != null) { fullName = user.DisplayName; } } }


Tal vez cometí un error en alguna parte, pero WinNT: // ... no funcionó para las cuentas de dominio para mí. Además, si el usuario no está en el mismo dominio que la máquina, entonces PrincipalContext puede no encontrar el elemento deseado (ya que busca en el contexto actual, si se usa como se indicó anteriormente).

Lo siguiente debe traducir el "nombre de dominio amigable" proporcionado por User.Identity.Name a un dominio compatible con ldap. El uso del nombre distintivo del dominio proporciona la información necesaria sobre la ruta ldap (que ha resuelto mi problema de dominio cruzado):

(VB.NET, sorry) Imports System.DirectoryServices Imports System.DirectoryServices.AccountManagement Imports System.DirectoryServices.ActiveDirectory ... Dim strUserName As String Dim objDirContext As DirectoryContext Dim objContext As PrincipalContext Dim objPrincipal As Principal Dim strLDAPDomainPath As String ... // User.Identity.Name delivers domain/account or account@domain // Split User.Identity.Name in domain and account as specified above strDomain = "my_domain" strAccount = "jdoe" // Get LDAP domain relative path (distinguishName) from short domain name (e.g. my_domain -> us.my_domain.com -> DC=us,DC=my_domain,DC=com) Try objDirContext = New DirectoryContext(DirectoryContextType.Domain, strDomain) strLDAPDomainPath = Domain.GetDomain(objDirContext).GetDirectoryEntry.Properties("distinguishedName").Value.ToString Catch objException As DirectoryServicesCOMException Throw New Exception("Couldn''t get LDAP domain: " & objException.Message) End Try // Find user in LDAP // Nothing results in using current domain controller Try objContext = New PrincipalContext(ContextType.Domain, Nothing, strLDAPDomainPath) objPrincipal = Principal.FindByIdentity(objContext, IdentityType.Name, strAccount) If Not IsNothing(objPrincipal) Then strUserName = objPrincipal.DisplayName End If Catch objException As Exception Throw New Exception("Couldn''t get user display name: " & objException.Message) End Try // strUserName should now contain the wanted full name