2009-07-09 24 views
16

No soy un desarrollador de .NET, y tengo la sensación de que esto sería trivial para alguien que es:Obtener UPN o correo electrónico para iniciar sesión de usuario en una aplicación .NET Web

Tengo una aplicación web C# eso hace que el usuario de las credenciales de usuario del usuario conectado. Actualmente se utiliza el SID que viene de

System.Security.Principal.WindowsIdentity.GetCurrent().User.Value 

que necesito para obtener ya sea la UPN usuarios de usuario o dirección de correo electrónico (como se define en el directorio activo) en lugar del SID. GetCurrent() devuelve un objeto de tipo WindowsIdentity; buscar en los detalles para los miembros WindowsIdentity:

MSDN: WindowsIdentity Members

no puedo ver nada que parece que yo tampoco la UPN o correo electrónico daría en ese país. ¿Cómo puedo obtener esa información para usar, ya sea alimentando el SID en alguna otra función o llamando a algo diferente en primer lugar?

Respuesta

35

Mientras tanto (.NET 3.5) se trata de una de una sola línea:

System.DirectoryServices.AccountManagement.UserPrincipal.Current.EmailAddress 

para el correo electrónico, o

System.DirectoryServices.AccountManagement.UserPrincipal.Current.UserPrincipalName 

para el UPN.

+0

¡Esto es asombroso! No sabía sobre el espacio de nombres AccountManagement, exactamente lo que estaba buscando. – davekaro

+0

Normalmente será nulo. – djunod

+0

Esto es bueno localmente pero no funciona en IIS. –

1

Probar:

System.Security.Principal.WindowsIdentity.GetCurrent().Name 
+1

La documentación dice "Obtiene el nombre de inicio de sesión de Windows del usuario". - ¿Esto devolverá el nombre de estilo NT o el nombre de estilo UPN? Sé que Microsoft dijo hace muchos años que UPN sería la nueva forma de identificar a los usuarios, pero en mi experiencia casi todo funciona con las credenciales NT Style, y los usuarios pueden iniciar sesión en este sitio con logotipos UPN o NT Style, así que no puedo confiar en él usando la misma forma que el usuario. – DrStalker

+0

Acabo de hacer una prueba rápida y System.Security.Principal.WindowsIdentity.GetCurrent(). Name devolviendo DOMAIN \ username – DrStalker

+0

de eso, puede alimentarlo en el objeto DirectorySearcher para obtener más detalles sobre ese usuario en particular. Para DirectorySearcher, consulte http://www.dotnetactivedirectory.com/Understanding_LDAP_Active_Directory_User_Object_Properties.html, http://blog.lozanotek.com/articles/149.aspx y http://codebetter.com/blogs/peter.van.ooijen/ archive/2006/12/12/Getting-information-out-of-active-directory_3A00_-DirectorySearcher_2C00_-Properties-and-DirectoryEntry.aspx. –

2

Para consultar el directorio activo usando un buscador de directorios que hay que hacer algo como esto (código totalmente no probado):

string userName = System.Security.Principal.WindowsIdentity.GetCurrent().Name; 
    string ldapPath = "LDAP://domain.company.com"; 

    public string GetEmail(string userName, string ldapPath) 
    { 
     using (DirectoryEntry root = new DirectoryEntry(ldapPath)) 
     { 
      DirectorySearcher searcher = new DirectorySearcher(root); 
      searcher.Filter = string.Format(@"(&(sAMAccountName={0}))", userName); 
      searcher.PropertiesToLoad = "mail"; 

      SearchResult result = searcher.FindOne(); 

      if (result != null) 
      { 
       PropertyValueCollection property = result.Properties["mail"]; 
       return (string)property.Value; 
      } 
      else 
      { 
       // something bad happened 
      } 
     } 
    } 
Cuestiones relacionadas