Как получить текущего пользователя, который обращается к приложению ASP.NET?
Чтобы получить текущего зарегистрированного пользователя в системе, я использую этот код:
string opl = System.Security.Principal.WindowsIdentity.GetCurrent().Name.ToString();
Я работаю над приложением ASP.NET, где мне нужна эта информация. Поэтому я поместил свое приложение на сервер и попробовал приведенный выше код, и я получил "Сетевой сервис" в строке opl. Мне нужно знать текущего пользователя ПК, который обращается к моему приложению ASP.NET.
9 ответов
Если вы используете членство, вы можете сделать: 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>
Ниже приведено правильное объяснение двух узлов и
И, конечно же, вы получаете имя пользователя по
//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);