Вопрос по active-directory, c#, .net – Получить UPN или адрес электронной почты для вошедшего в систему пользователя в веб-приложении .NET

18

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

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

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

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

MSDN: члены WindowsIdentity

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

Ваш Ответ

3   ответа
1

Пытаться:

System.Security.Principal.WindowsIdentity.GetCurrent().Name
Документация гласит: «Получает имя пользователя для входа в Windows». - вернет ли это имя в стиле NT или имя в стиле UPN? Я знаю, что Microsoft много лет назад сказала, что UPN будет новым способом идентификации пользователей, но по моему опыту почти все работает с учетными данными NT Style - и пользователи могут входить на этот сайт с логотипами UPN или NT Style, поэтому я не могу полагаться на ней, используя ту же форму, что и пользователь. DrStalker
Исходя из этого, вы можете передать его в объект DirectorySearcher, чтобы получить более подробную информацию об этом конкретном пользователе. Для DirectorySearcher см.dotnetactivedirectory.com/…, blog.lozanotek.com/articles/149.aspx а такжеcodebetter.com/blogs/peter.van.ooijen/archive/2006/12/12/….
Только что сделал быстрый тест и System.Security.Principal.WindowsIdentity.GetCurrent (). Name возвращает DOMAIN \ username DrStalker
38

System.DirectoryServices.AccountManagement.UserPrincipal.Current.EmailAddress

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

System.DirectoryServices.AccountManagement.UserPrincipal.Current.UserPrincipalName

для УПН.

Это хорошо локально, но не работает на IIS.
Это не работает кросс-домен
Это круто! Я не знал о пространстве имен AccountManagement - именно то, что я искал.
Обычно будет нулевым.
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
            }
        }
    }

Похожие вопросы