Pytanie w sprawie active-directory, .net, c# – Uzyskaj UPN lub e-mail dla zalogowanego użytkownika w aplikacji internetowej .NET

18

Nie jestem programistą .NET i mam wrażenie, że byłoby to banalne dla kogoś, kto:

Mam aplikację internetową C #, która czyni użytkownika poświadczeniami użytkownika zalogowanego użytkownika. Obecnie używa identyfikatora SID, z którego pochodzi

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

Muszę uzyskać login użytkownika UPN lub adres e-mail (zgodnie z definicją w katalogu aktywnym) zamiast identyfikatora SID. GetCurrent () zwraca obiekt typu WindowsIdentity; przeglądanie szczegółów dla członków WindowsIdentity:

MSDN: Członkowie WindowsIdentity

Nie widzę niczego, co mogłoby dać mi UPN lub e-mail. W jaki sposób mogę wykorzystać te informacje do użycia, albo poprzez podanie identyfikatora SID do innej funkcji, albo wywołanie czegoś innego w pierwszej kolejności.

Twoja odpowiedź

3   odpowiedź
38

Tymczasem (.NET 3.5) jest to jeden liner:

System.DirectoryServices.AccountManagement.UserPrincipal.Current.EmailAddress

na e-mail lub

System.DirectoryServices.AccountManagement.UserPrincipal.Current.UserPrincipalName

dla UPN.

Jest to dobre lokalnie, ale nie działa na IIS. nPcomp
Zwykle będzie null. djunod
To nie działa między domenami Sebazzz
To jest niesamowite! Nie wiedziałem o przestrzeni nazw AccountManagement - dokładnie tego, czego szukałem. davekaro
1

Próbować:

System.Security.Principal.WindowsIdentity.GetCurrent().Name
z tego możesz podać go do obiektu DirectorySearcher, aby uzyskać więcej informacji na temat tego konkretnego użytkownika. Dla DirectorySearcher, patrzdotnetactivedirectory.com/…, blog.lozanotek.com/articles/149.aspx icodebetter.com/blogs/peter.van.ooijen/archive/2006/12/12/…. Jimmy Chandra
Po prostu wykonałem szybki test i System.Security.Principal.WindowsIdentity.GetCurrent (). Nazwa zwraca DOMAIN \ t DrStalker
Dokumentacja mówi „Pobiera nazwę logowania użytkownika systemu Windows”. - czy zwróci nazwę stylu NT lub nazwę stylu UPN? Wiem, że Microsoft powiedział wiele lat temu, że UPN będzie nowym sposobem identyfikacji użytkowników, ale z mojego doświadczenia wynika, że ​​prawie wszystko działa w oparciu o poświadczenia stylu NT - a użytkownicy mogą logować się do tej witryny za pomocą logo UPN lub NT, więc nie mogę polegać na tym samym formularzu, co użytkownik. DrStalker
2

Aby zapytać aktywny katalog za pomocą wyszukiwarki katalogów, musisz zrobić coś takiego (całkowicie niesprawdzony kod):

    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 pytania