2009-07-09 2 views
16

Je ne suis pas un développeur .NET, et j'ai le sentiment que ce serait trivial pour quelqu'un qui est:Get UPN ou email utilisateur connecté dans une application Web .NET

J'ai un C# application web cela rend l'utilisateur des informations d'identification de l'utilisateur connecté. À l'heure actuelle, il utilise le SID qui vient de

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

Je dois obtenir soit les utilisateurs UPN login ou adresse e-mail (tel que défini dans le répertoire actif) au lieu du SID. GetCurrent() renvoie un objet de type WindowsIdentity; regardant dans les détails pour WindowsIdentity Membres:

MSDN: WindowsIdentity Members

Je ne vois rien qui ressemble à cela me donnerait soit l'UPN ou par courriel à l'intérieur. Comment puis-je obtenir cette information à utiliser, soit en alimentant le SID dans une autre fonction ou en appelant quelque chose de différent en premier lieu.

Répondre

35

Pendant ce temps (.NET 3.5) Ce one-liner:

System.DirectoryServices.AccountManagement.UserPrincipal.Current.EmailAddress 

pour le courrier électronique, ou

System.DirectoryServices.AccountManagement.UserPrincipal.Current.UserPrincipalName 

pour l'UPN.

+0

C'est génial! Je ne connaissais pas l'espace de noms AccountManagement - exactement ce que je cherchais. – davekaro

+0

Sera généralement nul. – djunod

+0

C'est bon localement mais ne fonctionne pas sur IIS. –

1

Essayez:

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

La documentation indique "Obtient le nom d'ouverture de session Windows de l'utilisateur". - cela retournera-t-il le nom de style NT ou le nom de style UPN? Je sais que Microsoft a dit il y a plusieurs années qu'UPN serait la nouvelle façon d'identifier les utilisateurs, mais selon mon expérience, presque tout fonctionne avec les informations de style NT - et les utilisateurs peuvent se connecter à ce site avec des connexions UPN ou NT Style. sur lui en utilisant la même forme que l'utilisateur a fait. – DrStalker

+0

Juste fait un test rapide et System.Security.Principal.WindowsIdentity.GetCurrent(). Nom renvoie DOMAIN \ nom d'utilisateur – DrStalker

+0

à partir de cela, vous pouvez le nourrir dans l'objet DirectorySearcher pour obtenir plus de détails sur cet utilisateur particulier. Pour DirectorySearcher, voir http://www.dotnetactivedirectory.com/Understanding_LDAP_Active_Directory_User_Object_Properties.html, http://blog.lozanotek.com/articles/149.aspx et http://codebetter.com/blogs/peter.van.ooijen/ archive/2006/12/12/Obtenir-des-informations-hors-de-répertoire-actif_3A00_-DirectorySearcher_2C00_-Properties-and-DirectoryEntry.aspx. –

2

Pour interroger le répertoire actif à l'aide d'un chercheur de répertoire que vous devez faire quelque chose comme ça (code totalement non testé):

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 
      } 
     } 
    } 
Questions connexes