Как получить текущего пользователя, который обращается к приложению ASP.NET?

Чтобы получить текущего пользователя в системе, я использую этот код:

string opl = System.Security.Principal.WindowsIdentity.GetCurrent().Name.ToString();

Я работаю над приложением ASP.NET, где мне нужна эта информация. Поэтому я поставил свое приложение на сервер и попробовал код выше, и я получаю "Network Service" в строке opl. Мне нужно знать текущего пользователя ПК, который обращается к моему приложению ASP.NET.

Ответы

Ответ 1

Если вы используете членство, вы можете сделать: Membership.GetUser()

Ваш код возвращает учетную запись Windows, назначенную ASP.NET.

Ответ 2

Быстрый ответ User = System.Web.HttpContext.Current.User

Убедитесь, что ваш web.config имеет следующий элемент аутентификации.

<configuration>
    <system.web>
        <authentication mode="Windows" />
        <authorization>
            <deny users="?"/>
        </authorization>
    </system.web>
</configuration>

Дополнительная литература: Рецепт: включение проверки подлинности Windows в веб-приложении ASP.NET для интрасети

Ответ 3

Использование System.Web.HttpContext.Current.User.Identity.Name должно работать. Проверьте настройки сайта IIS на сервере, на котором размещен ваш сайт, выполнив следующие действия:

  • Перейдите в раздел IIS → Сайты → Ваш сайт → Аутентификация

    IIS Settings

  • Теперь проверьте, что анонимный доступ отключен, и аутентификация Windows включена.

    Authentication

  • Теперь System.Web.HttpContext.Current.User.Identity.Name должен вернуть что-то вроде этого:

    domain\username

Ответ 4

Лучшей практикой является проверка свойства 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;
    }
}

Ответ 5

Вы можете просто использовать свойство страницы. И интересно то, что вы можете получить доступ к этому свойству в любом месте своего кода.

Используйте это:

HttpContext.Current.User.Identity.Name

Ответ 6

Не смотрите слишком далеко.

Если вы работаете с ASP.NET MVC, вы просто используете пользователя как свойство класса Controller. Поэтому, если вы потерялись в некоторых моделях, ищущих текущего пользователя, попробуйте отступить и получить соответствующую информацию в контроллере.

В контроллере просто используйте:

using Microsoft.AspNet.Identity;

  ...

  var userId = User.Identity.GetUserId();
  ...

с userId как строка.

Ответ 7

Похоже, что общий консенсусный ответ выше имеет проблему совместимости с поддержкой 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;

Ответ 8

Я побежал в том же номере.

Вот что сработало для меня:

Setting up Authentication in IIS Panel

Setting up Properties of Windows Authentication in IIS

Настройка свойств проверки подлинности Windows в IIS NTLM has to be the topmost

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);