Получить полное имя пользователя из Machine Context

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

Наша тестовая среда не является частью рабочего домена, и у тестовых пользователей нет доменных учетных записей в тестовой среде. Итак, мы добавляем их как пользователей локальной машины. У них запрашиваются учетные данные при переходе на начальную страницу. Я использую следующий метод, чтобы получить 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 или Surname. Есть ли способ установить эти значения при создании пользователя (Windows Server 2008) или мне нужно сделать это по-другому?


person HitLikeAHammer    schedule 02.10.2009    source источник


Ответы (1)


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

Кроме того, User.Identity.Name недоступен и должен быть передан.

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

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 (вместо GivenName и Surname);

person HitLikeAHammer    schedule 02.10.2009