2009-08-12 3 views
42

Я создаю приложение asp.net mvc для intranet, к которому должен иметь доступ все пользователи компании. Мне нужно запустить сайт, выданный за доступ к базе данных и т. Д., Но я хочу знать, кто каждый пользователь.Как получить имя пользователя Windows, когда личность олицетворяется = "true" в asp.net?

Когда я смотрю Page.User.Identity.Name, это пусто. Возможно ли получить имя учетной записи пользователя Windows, даже если сайт работает под управлением?

Редактировать: Немного больше информации. У меня есть сайт в IIS 6 с включенным анонимным доступом. Сайт работает под системной учетной записью, имеющей доступ к базе данных (поскольку все сотрудники не имеют доступа к базе данных).

Мой web.config имеет <authentication mode="Windows" /> и <identity impersonate="true"/>

Моя цель состоит в том, что пользователи не должны войти в систему - тот факт, что они вошли в нашу сеть (и тот факт, что сайт не на внешний IP) достаточно аутентификации. Я просто хотел бы знать, кто является пользователем для того, чтобы отслеживать изменения, которые они делают, и т.д.

ответ

108

С <authentication mode="Windows"/> в приложении и анонимный доступ включен в IIS, вы увидите следующие результаты:

System.Environment.UserName: Computer Name 
Page.User.Identity.Name: Blank 
System.Security.Principal.WindowsIdentity.GetCurrent().Name: Computer Name 

С <authentication mode="Windows"/> в приложении, и «Анонимный доступ» инвалидов и только «Комплексная проверка подлинности Windows», в IIS, вы увидите следующие результаты:

System.Environment.UserName: ASPNET (user account used to run ASP.NET service) 
Page.User.Identity.Name: Domain\ Windows Account Name 
System.Security.Principal.WindowsIdentity.GetCurrent().Name: Computer Name\ASPNET 

с <authentication mode="Windows"/> и <identity impersonate ="true"/> в вашем приложении, и «Анонимный доступ» инвалидов и только «Встроенный Wi ndows Authentication»в IIS, вы увидите следующие результаты:

System.Environment.UserName: Windows Account Name 
Page.User.Identity.Name: Domain\ Windows Account Name 
System.Security.Principal.WindowsIdentity.GetCurrent().Name: Domain\ Windows Account Name 
+1

Это один из тех ответов, на который я хочу, чтобы был любимый ответ, например, любимые вопросы. – BlackTigerX

+0

@BlackTigerX. Есть, вы можете присудить награды выдающимся ответам ... Таким образом, вы получаете значок Altruist * Первая награда, которую вы вручную присуждаете вопрос другого человека * –

+0

Почему Microsoft не содержит четких, коротких объяснений, подобных этому в своей документации? Спасибо за этот ответ. – Jimmy

4

попробовать это

Principal.WindowsIdentity.GetCurrent.Name 

Она должна возвращать строку с пользователями не регистрационное имя

+0

Благодаря Гав - Я попробовал это и отображает имя учетной записи, что мой сайт является установка для запуска под (см Edit в вопросе более Информация). – MrDustpan

+2

Подумайте, что вам нужно отключить анонимный доступ в IIS, когда они посещают сайт при условии, что они вошли в домен IIS, будут использовать свой текущий логин. В приведенном выше коде должен отображаться идентификатор пользователя, а не один из IIS. – Gavin

1

Если этой функции изменилось в рамках MVC, и я не думаю, что это должно быть. Page.User.Identity.Name должно по-прежнему работать. Похоже, что ваш сайт настроен на анонимную аутентификацию. Если это так, попробуйте отключить его.

+0

Спасибо Райан. Я добавил несколько вопросов к вопросу, но в основном мне нужна анонимная аутентификация. – MrDustpan

+0

С учетом дополнительной информации вы хотите ''. Вы хотите, чтобы веб-приложение выполнялось под идентификатором, предоставленным IIS. 'impersonate =" false "' гарантирует, что это так. Вы также хотите включить встроенную проверку подлинности и отключить анонимную аутентификацию. Это гарантирует, что Page.User.Identity будет идентификатором пользователя, просматривающего страницу. Им не нужно фактически предоставлять учетные данные, если сервер и пользователи находятся в одном домене. – Ryan

+0

И извините за то, что так долго ответили. У меня не было возможности принять участие здесь через некоторое время. – Ryan