Получение полного имени пользователя из контекста компьютера

StackOverflow https://stackoverflow.com/questions/1510585

Вопрос

У меня есть ASP.NET приложение, которое работает в нашей внутренней сети.В рабочей среде я могу получить пользователя из контекста домена и иметь доступ к большому количеству информации, включая его имя и фамилию (UserPrincipal.GivenName и UserPrincipal.Familyname).

Наша тестовая среда не является частью производственного домена, и у пользователей тестирования нет учетных записей домена в тестовой среде.Итак, мы добавляем их как пользователей локального компьютера.Им предлагается ввести учетные данные, когда они переходят на стартовую страницу.Я использую следующий метод, чтобы получить UserPrincipal

public static UserPrincipal GetCurrentUser()
        {
            UserPrincipal up = null;

            using (PrincipalContext context = new PrincipalContext(ContextType.Domain))
            {
                up = UserPrincipal.FindByIdentity(context, User.Identity.Name);
            }

            if (up == null)
            {
                using (PrincipalContext context = new PrincipalContext(ContextType.Machine))
                {
                    up = UserPrincipal.FindByIdentity(context, User.Identity.Name);
                }
            }

            return up;
        }

Проблема, с которой я сталкиваюсь здесь, заключается в том, что когда UserPrinicipal повторно запрашивается при ContextType == Machine, я не получаю такие свойства, как GivenName или Фамилия.Есть ли способ установить эти значения при создании пользователя (Windows Server 2008) или мне нужно сделать это другим способом?

Это было полезно?

Решение

Функция в исходном вопросе должна быть изменена.Если вы попытаетесь получить доступ к возвращаемому объекту UserPrincipal, вы получите исключение ObjectDisposedException

Кроме того, Пользователь.Идентификатор.Имя недоступно и должно быть передано.

Я внес следующие изменения в описанную выше функцию.

public static UserPrincipal GetUserPrincipal(String userName)
        {
            UserPrincipal up = null;

            PrincipalContext context = new PrincipalContext(ContextType.Domain);
            up = UserPrincipal.FindByIdentity(context, userName);

            if (up == null)
            {
                context = new PrincipalContext(ContextType.Machine);
                up = UserPrincipal.FindByIdentity(context, userName);
            }

            if(up == null)
                throw new Exception("Unable to get user from Domain or Machine context.");

            return up;
        }

Кроме того, свойство UserPrincipal, которое мне нужно использовать, - это DisplayName (вместо заданных имени и фамилии);

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top