2009-07-09 6 views
16

Io non sono uno sviluppatore .NET, e ho la sensazione che questo sarebbe banale per qualcuno che è:Ottenere UPN o e-mail per clienti registrati in un'applicazione .NET web

Ho un C# applicazione web che rende utente le credenziali dell'utente dell'utente connesso. Attualmente si utilizza il SID che viene da

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

ho bisogno di ottenere sia l'utenti UPN login o l'indirizzo e-mail (come definito nella directory attiva) al posto del SID. GetCurrent() restituisce un oggetto di tipo WindowsIdentity; guardando nei dettagli per WindowsIdentity Membri:

MSDN: WindowsIdentity Members

non riesco a vedere tutto ciò che sembra che mi sia l'UPN o e-mail avrebbe dato in là. Come posso ritirare le informazioni da usare, sia alimentando il SID in qualche altra funzione, sia chiamando qualcosa di diverso in primo luogo.

risposta

35

Nel frattempo (.NET 3.5) si tratta di una one-liner:

System.DirectoryServices.AccountManagement.UserPrincipal.Current.EmailAddress 

per l'e-mail, o

System.DirectoryServices.AccountManagement.UserPrincipal.Current.UserPrincipalName 

per UPN.

+0

Questo è fantastico! Non conoscevo lo spazio dei nomi di AccountManagement, esattamente quello che stavo cercando. – davekaro

+0

Di solito sarà nullo. – djunod

+0

Questo è buono localmente ma non funziona su IIS. –

1

Prova:

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

La documentazione dice "Ottiene il nome di accesso di Windows dell'utente." - questo restituirà il nome in stile NT o il nome di stile UPN? So che Microsoft ha detto molti anni fa che UPN sarebbe il nuovo modo di identificare gli utenti, ma nella mia esperienza quasi tutto funziona con credenziali di stile NT - e gli utenti possono accedere a questo sito con logo in stile UPN o NT, quindi non posso fare affidamento su di esso usando lo stesso modulo che l'utente ha fatto. – DrStalker

+0

Ho appena eseguito un test rapido e System.Security.Principal.WindowsIdentity.GetCurrent(). Il nome restituisce DOMAIN \ nomeutente – DrStalker

+0

da questo, è possibile inserirlo nell'oggetto DirectorySearcher per ottenere ulteriori dettagli su quell'utente specifico. Per DirectorySearcher, vedere http://www.dotnetactivedirectory.com/Understanding_LDAP_Active_Directory_User_Object_Properties.html, http://blog.lozanotek.com/articles/149.aspx e http://codebetter.com/blogs/peter.van.ooijen/ archive/2006/12/12/Getting-informazioni-out-of-active-directory_3A00_-DirectorySearcher_2C00_-Properties-e-DirectoryEntry.aspx. –

2

per interrogare l'indice attivo usando un ricercatore directory è necessario fare qualcosa di simile (codice totalmente non testato):

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 
      } 
     } 
    } 
Problemi correlati