Как получить текущего пользователя, который обращается к приложению 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 на сервере, на котором размещен ваш сайт, выполнив следующие действия:

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

    Настройки IIS

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

    Аутентификация

  3. Сейчас 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);

для меня я просто делаю:

      User.Claims.ToArray()[1].Value
Другие вопросы по тегам