Как получить у текущего пользователя идентичность windows - PullRequest
9 голосов
/ 08 марта 2011

Сайт работает на моем локальном IIS 6.1.Я хотел бы добавить некоторые функции для извлечения информации из нашей AD.Мой код AD работает во многих других проектах и ​​на моем сервере разработки.Вот мои попытки выписать имя пользователя:

Response.Write("1. " + this.Request.LogonUserIdentity.Name);
Response.Write("2. " + Request.ServerVariables["Auth_User"]);
Response.Write("3. " + WindowsIdentity.GetCurrent().Name.ToString());

Я получаю следующие результаты:

  1. NT AUTHORITY \ IUSR
  2. Администратор
  3. NT AUTHORITY \ NETWORK SERVICE

Как узнать действительное имя пользователя Windows, такое как ourdomain / username

Спасибо

Ответы [ 5 ]

15 голосов
/ 08 марта 2011

Здесь есть два разных пользователя windows - первый - пользователь вашего приложения, а второй - пользователь (или учетная запись windows), под которым работает ваше приложение ASP.NET (пул приложений с точки зрения IIS). WindowsIdentity.GetCurrent обычно возвращает эту ссылку.

Чтобы получить действительного пользователя Windows, который использует приложение, вы должны включить аутентификацию. Для этого вы можете включить встроенную аутентификацию (windows-аутентификацию) в IIS для указанного веб-сайта. Также измените конфигурацию ASP.NET, чтобы использовать проверку подлинности Windows. Теперь вы можете использовать HttpContext.Current.User.Identity, чтобы получить фактического пользователя.

3 голосов
/ 08 марта 2011

HttpContext.Current.User.Identity может быть полезным для вас здесь.

Аналогично System.Threading.Thread.CurrentPrincipal может помочь.

Но дело может быть в том, что вы фактически должны установить экземпляр удостоверения в качестве пользователявходит в систему (хотя не обязательно реализует IPrincipal и окружающие механизмы, а использует встроенную реализацию WindowsIdentity).

Я не на 100% уверен, аутентификация Windows может установите это автоматически для простого извлечения.

Также проверьте эту ссылку из MSDN , которая описывает основные пользовательские операции,

2 голосов
/ 08 марта 2011

Этот фрагмент показывает, как установлен LogonUserIdentity (с использованием отражателя)

 if ((this._wr is IIS7WorkerRequest) && (((this._context.NotificationContext.CurrentNotification == RequestNotification.AuthenticateRequest) && !this._context.NotificationContext.IsPostNotification) || (this._context.NotificationContext.CurrentNotification < RequestNotification.AuthenticateRequest)))
        {
            throw new InvalidOperationException(SR.GetString("Invalid_before_authentication"));
        }
        IntPtr userToken = this._wr.GetUserToken();
        if (userToken != IntPtr.Zero)
        {
            string serverVariable = this._wr.GetServerVariable("LOGON_USER");
            string str2 = this._wr.GetServerVariable("AUTH_TYPE");
            bool isAuthenticated = !string.IsNullOrEmpty(serverVariable) || (!string.IsNullOrEmpty(str2) && !StringUtil.EqualsIgnoreCase(str2, "basic"));
            this._logonUserIdentity = CreateWindowsIdentityWithAssert(userToken, (str2 == null) ? "" : str2, WindowsAccountType.Normal, isAuthenticated);
        }

Как вы можете видеть, это было изменено для IIS 7. Я полагаю, что вы используете Аутентификация Windows + Олицетворение , поэтому я бы пошел с последним (WindowsIdentity.GetCurrent()), который, я уверен, является запросом идентификации, с которым выполняется.

0 голосов
/ 08 марта 2011

Во-первых, убедитесь, что веб-сайт находится в зоне интрасети (например, просто http://servername/, а не http://www.servername.com/),, или вам необходимо добавить свое полное доменное имя в параметры безопасности доверенных сайтов IE.

Во-вторых, если вы не используете зону интрасети, убедитесь, что IE отправляет учетные данные - Инструменты -> Свойства обозревателя -> Безопасность -> Пользовательский уровень -> Аутентификация пользователя -> Вход в систему -> Автоматический вход с текущими именем пользователя и паролем

0 голосов
/ 08 марта 2011

Входит ли пользователь на сайт, используя свой домен AD / имя пользователя, если это так, захватите имя пользователя / домен в этот момент?

Если нет, вы не сможете получить это, если случайный веб-сайт сможет получить домен / имя пользователя для текущего входа пользователя, что будет большой проблемой безопасности, не так ли?

...