2009-07-09 4 views
16

nie jestem programista .NET, a mam wrażenie, to byłoby trywialne dla kogoś, kto jest:Get UPN lub e-mail dla zalogowanego użytkownika w aplikacji .NET internetowej

Mam aplikacji WWW C# to czyni użytkownika z poświadczeń użytkownika zalogowanego użytkownika. Obecnie używa SID, która pochodzi od

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

Muszę dostać albo użytkowników UPN login lub adres e-mail (jak określono w Active Directory) zamiast SID. GetCurrent() zwraca obiekt typu WindowsIdentity; patrząc w szczegółach dotyczących WindowsIdentity Członkowie:

MSDN: WindowsIdentity Members

nie widzę niczego, co wygląda jak byłoby mi dać ani UPN lub e-mail tam. W jaki sposób mogę wyciągnąć te informacje do użycia, albo przez przekazanie identyfikatora SID do innej funkcji, albo nazywanie czegoś zupełnie innego.

Odpowiedz

35

międzyczasie (.NET 3.5) jest to jedno-liner:

System.DirectoryServices.AccountManagement.UserPrincipal.Current.EmailAddress 

na e-mail lub

System.DirectoryServices.AccountManagement.UserPrincipal.Current.UserPrincipalName 

dla UPN.

+0

To jest niesamowite! Nie wiedziałem o przestrzeni nazw AccountManagement - dokładnie tego, czego szukałem. – davekaro

+0

Zwykle będzie mieć wartość NULL. – djunod

+0

To jest dobre lokalnie, ale nie działa w IIS. –

1

Spróbuj:

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

Dokumentacja mówi "Pobiera nazwę logowania Windows użytkownika." - czy to zwróci nazwę stylu NT lub nazwę stylu UPN? Wiem, że Microsoft powiedział wiele lat temu, że UPN jest nowym sposobem identyfikowania użytkowników, ale z mojego doświadczenia wynika, że ​​prawie wszystko działa z poświadczeniami NT Style - i użytkownicy mogą logować się do tej witryny z logo w stylu UPN lub NT Style, więc nie mogę polegać na tym samym formularzu, który zrobił użytkownik. – DrStalker

+0

Po prostu wykonałem szybki test i System.Security.Principal.WindowsIdentity.GetCurrent(). Nazwa powraca z DOMAIN \ nazwa_użytkownika – DrStalker

+0

z tego, można ją wprowadzić do obiektu DirectorySearcher, aby uzyskać więcej szczegółów na temat tego konkretnego użytkownika. W przypadku DirectorySearcher, zobacz http://www.dotnetactivedirectory.com/Niezmienianie_LDAP_Active_Directory_User_Object_Properties.html, http://blog.lozanotek.com/articles/149.aspx i http://codebetter.com/blogs/peter.van.ooijen/ archiwum/2006/12/12/Pobieranie informacji poza katalogiem aktywnym_3A00_-DirectorySearcher_2C00_-Properties-and-DirectoryEntry.aspx. –

2

Aby zapytać Active Directory przy użyciu wyszukiwarki katalogu trzeba zrobić coś takiego (kod całkowicie niesprawdzonych):

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 
      } 
     } 
    } 
Powiązane problemy