Получить UPN или адрес электронной почты для вошедшего в систему пользователя в веб-приложении.NET

Я не разработчик.NET, и у меня есть чувство, что это будет тривиально для кого-то, кто:

У меня есть веб-приложение C#, которое делает пользователя учетными данными пользователя, вошедшего в систему. В настоящее время он использует SID, который исходит от

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

Мне нужно получить либо имя пользователя UPN, либо адрес электронной почты (как определено в активной директории) вместо SID. GetCurrent() возвращает объект типа WindowsIdentity; глядя на детали для членов WindowsIdentity:

MSDN: члены WindowsIdentity

Я не вижу ничего, что выглядит так, как будто это даст мне либо UPN, либо письмо по электронной почте. Как я могу получить эту информацию для использования, либо введя SID в какую-то другую функцию, либо вызвав что-то другое в первую очередь.

3 ответа

Решение

Между тем (.NET 3.5) это одна строка:

System.DirectoryServices.AccountManagement.UserPrincipal.Current.EmailAddress

для электронной почты, или

System.DirectoryServices.AccountManagement.UserPrincipal.Current.UserPrincipalName

для UPN.

Чтобы запросить активный каталог с помощью поисковика каталогов, вам нужно сделать что-то вроде этого (полностью непроверенный код):

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

Пытаться:

System.Security.Principal.WindowsIdentity.GetCurrent().Name
Другие вопросы по тегам