Получите UPN или электронную почту для входа в систему в веб-приложении .NET.

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

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

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

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

MSDN: пользователи WindowsIdentity

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

Ответы

Ответ 1

Между тем (.NET 3.5) это однострочный:

System.DirectoryServices.AccountManagement.UserPrincipal.Current.EmailAddress

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

System.DirectoryServices.AccountManagement.UserPrincipal.Current.UserPrincipalName

для UPN.

Ответ 2

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

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

Ответ 3

Try:

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