Вопрос по asp.net-mvc, impersonation – Как получить имя пользователя Windows, когда идентификатор impersonate = «true» в asp.net?

42

Я создаю приложение для интранета asp.net mvc, к которому у всех в компании должен быть доступ. Мне нужно запустить веб-сайт под видом доступа к базе данных и т. Д., Но я хочу знать, кем является каждый пользователь.

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

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

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

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

Ваш Ответ

4   ответа
4

попробуй это

Principal.WindowsIdentity.GetCurrent.Name

Должен вернуть строку с логином пользователя

Подумайте, что вам нужно отключить анонимный доступ в IIS, когда они посещают сайт, предполагая, что они вошли в домен. IIS будет использовать свой текущий логин. Приведенный выше код должен отображать их идентификатор пользователя, а не тот, под которым работает IIS.
Спасибо Гав - я попробовал это, и он отображает имя учетной записи, под которой мой сайт настроен для запуска (см. Редактирование в вопросе для получения дополнительной информации). MrDustpan
115

С<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"/> в вашем приложении и & # x2018; Анонимный доступ & # x2019; отключено и только & # x2018; Интегрированная проверка подлинности Windows & # x2019; в 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"/> в вашем приложении и & # x2018; Анонимный доступ & # x2019; отключено и только & # x2018; Интегрированная проверка подлинности Windows & # x2019; в 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
А как насчет Thread.CurrentPrincipal.Identity.Name? Если вы также добавите это, я думаю, что это будет более полным.
Почему Microsoft не включает четкие краткие пояснения, подобные этому, в свою документацию? Спасибо за этот ответ.
@ BlackTigerX Вы можете присудить награды за выдающиеся ответы ... За это вы получите значок альтруистаFirst bounty you manually award on another person's question
Это один из тех ответов, где бы я хотел, чтобы был любимый ответ, например, любимые вопросы.
0

Я просто хотел опубликовать свое исправление, потому что никто больше ничего об этом не говорил.

У меня была такая же проблема, когда я публиковал сайт на сервере, но не на моем локальном компьютере. Все настройки были одинаковыми. Однако в IIS «Веб-сайт по умолчанию» никогда не был выключен. Он работал и перехватывал трафик, хотя с ним не было связано ни одного сайта. По умолчанию анонимная проверка подлинности была включена, но на моем веб-сайте, работающем под портом 80, она отключена. Похоже, не имеет значения, что на моем сайте она была отключена ..., поскольку по умолчанию она включена, она была включена для всего трафика. в порт 80.

Отключение веб-страницы по умолчанию устранило проблему. Также смена порта на 8080 работает.

Я надеюсь, что это помогает кому-то.

1

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

Учитывая дополнительную информацию, вы хотите<identity impersonate="false"/ >, Вы хотите, чтобы веб-приложение запускалось под идентификатором, предоставленным IIS.impersonate="false" удостоверяется, что это так. Вы также хотите включить встроенную аутентификацию и отключить анонимную аутентификацию. Это гарантирует, что Page.User.Identity будет идентифицировать пользователя, просматривающего страницу. Они не должны фактически предоставлять учетные данные, если сервер и пользователи находятся в одном домене.
Спасибо Райан. Я добавил несколько деталей к вопросу, но в основном мне нужна анонимная аутентификация. MrDustpan
И извините, что так долго отвечал. У меня не было возможности поучаствовать здесь некоторое время.

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