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