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

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

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

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

Ответы [ 8 ]

48 голосов
/ 24 марта 2011

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

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

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

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

18 голосов
/ 28 июня 2013

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

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

    IIS Settings

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

    Authentication

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

    <i>domain</i>\<i>username</i>

15 голосов
/ 24 марта 2011

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

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

7 голосов
/ 15 июля 2014

Лучше всего сначала проверить свойство 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 голосов
/ 20 сентября 2016

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

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

HttpContext.Current.User.Identity.Name
2 голосов
/ 24 марта 2016

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

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

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

using Microsoft.AspNet.Identity;

  ...

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

с userId в виде строки.

1 голос
/ 18 октября 2018

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

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

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

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>

См. Ниже правильное объяснение двух узлов и

Разница между и ?

И, конечно, вы получаете имя пользователя по

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