Ответ 1
Если вы используете членство, вы можете сделать: Membership.GetUser()
Ваш код возвращает учетную запись Windows, назначенную ASP.NET.
Чтобы получить текущего пользователя в системе, я использую этот код:
string opl = System.Security.Principal.WindowsIdentity.GetCurrent().Name.ToString();
Я работаю над приложением ASP.NET, где мне нужна эта информация. Поэтому я поставил свое приложение на сервер и попробовал код выше, и я получаю "Network Service" в строке opl. Мне нужно знать текущего пользователя ПК, который обращается к моему приложению ASP.NET.
Если вы используете членство, вы можете сделать: Membership.GetUser()
Ваш код возвращает учетную запись Windows, назначенную ASP.NET.
Быстрый ответ User = System.Web.HttpContext.Current.User
Убедитесь, что ваш web.config имеет следующий элемент аутентификации.
<configuration>
<system.web>
<authentication mode="Windows" />
<authorization>
<deny users="?"/>
</authorization>
</system.web>
</configuration>
Дополнительная литература: Рецепт: включение проверки подлинности Windows в веб-приложении ASP.NET для интрасети
Использование System.Web.HttpContext.Current.User.Identity.Name
должно работать.
Проверьте настройки сайта IIS на сервере, на котором размещен ваш сайт, выполнив следующие действия:
Перейдите в раздел IIS → Сайты → Ваш сайт → Аутентификация
Теперь проверьте, что анонимный доступ отключен, и аутентификация Windows включена.
Теперь System.Web.HttpContext.Current.User.Identity.Name
должен вернуть что-то вроде этого:
domain\username
Лучшей практикой является проверка свойства Identity.IsAuthenticated
сначала, а затем получение usr.UserName
следующим образом:
string userName = string.Empty;
if (System.Web.HttpContext.Current != null &&
System.Web.HttpContext.Current.User.Identity.IsAuthenticated)
{
System.Web.Security.MembershipUser usr = Membership.GetUser();
if (usr != null)
{
userName = usr.UserName;
}
}
Вы можете просто использовать свойство страницы. И интересно то, что вы можете получить доступ к этому свойству в любом месте своего кода.
Используйте это:
HttpContext.Current.User.Identity.Name
Не смотрите слишком далеко.
Если вы работаете с ASP.NET MVC, вы просто используете пользователя как свойство класса Controller
. Поэтому, если вы потерялись в некоторых моделях, ищущих текущего пользователя, попробуйте отступить и получить соответствующую информацию в контроллере.
В контроллере просто используйте:
using Microsoft.AspNet.Identity;
...
var userId = User.Identity.GetUserId();
...
с userId
как строка.
Похоже, что общий консенсусный ответ выше имеет проблему совместимости с поддержкой CORS. Чтобы использовать атрибут HttpContext.Current.User.Identity.Name, необходимо отключить анонимную проверку подлинности, чтобы проверка подлинности Windows предоставляла информацию о проверенных пользователях. К сожалению, я полагаю, что вы должны включить анонимную аутентификацию для обработки запроса OPTIONS перед полетом в сценарии CORS.
Вы можете обойти это, оставив анонимную аутентификацию включенной и используя вместо этого атрибут HttpContext.Current.Request.LogonUserIdentity. Это вернет аутентифицированную информацию о пользователе (при условии, что вы находитесь в сценарии интрасети) даже с включенной анонимной аутентификацией. Атрибут возвращает структуру данных WindowsUser, и оба они определены в пространстве имен System.Web.
using System.Web;
WindowsIdentity user;
user = HttpContext.Current.Request.LogonUserIdentity;
Я побежал в том же номере.
Вот что сработало для меня:
Настройка свойств проверки подлинности Windows в IIS
NTLM должен быть самым верхним. Дальнейшие изменения Web.config, убедитесь, что у вас уже есть или добавьте, если они не существуют:
<system.web>
<authentication mode="Windows" />
<identity impersonate="true"/>
</system.web>
<!-- you need the following lines of code to bypass errors, concerning type of Application Pool (integrated pipeline or classic) -->
<system.webServer>
<validation validateIntegratedModeConfiguration="false"/>
</system.webServer>
Ниже приведено правильное объяснение двух узлов и
Разница между <system.web> и <system.webServer>?
И, конечно же, вы получаете имя пользователя по
//I am using the following to get the index of the separator "\\" and remove the Domain name from the string
int indexOfSlashChar = HttpContext.Current.User.Identity.Name.IndexOf("\\");
loggedInWindowsUserName = HttpContext.Current.User.Identity.Name.Substring(indexOfSlashChar + 1);