Как получить текущего пользователя в ASP.NET MVC

268

В модели форм я использовал текущего вошедшего в систему пользователя:

Page.CurrentUser

Как получить текущего пользователя внутри класса контроллера в ASP.NET MVC?

Серхат Озгель
источник

Ответы:

266

Если вам нужно получить пользователя из контроллера, используйте Userсвойство Controller. Если вам это нужно с точки зрения, я бы заполнил то, что вам конкретно нужно ViewData, или вы могли бы просто позвонить пользователю, так как я думаю, что это свойство ViewPage.

Haacked
источник
2
«или вы могли бы просто позвонить пользователю, так как я думаю, что это свойство ViewPage» - так вы имеете в виду использовать Page.user, когда находитесь в представлении?
Мавалдне
17
Да, вы можете использовать его как "Привет, @ User.Identity.Name!" в cshtml.
Шон
198

Я обнаружил, что Userработает, то есть User.Identity.Nameили User.IsInRole("Administrator").

Питер Мортенсен
источник
19
Просто добавьте к этому, если вы работаете в классе за пределами формы, вам нужно либо Imports System.Webпройти квалификацию с помощью HttpContext.Current.User.Identity.Name, либо напрямую квалифицировать, используя полный синтаксис:System.Web.HttpContext.Current.User.Identity.Name
Пол
Работает внутри Контроллера и при использовании ViewModel либо наследуется от Контроллера, либо следует совету Пола.
ПолезноБи
60

Попробуй HttpContext.Current.User.

Открытое общее свойство Current () как
член System.Web.HttpContext из System.Web.HttpContext

Сводка.
Получает или задает объект System.Web.HttpContext для текущего HTTP-запроса.

Возвращаемые значения:
System.Web.HttpContext для текущего HTTP-запроса.

голубь
источник
2
По-видимому, HttpContext не имеет свойства с именем «Текущий».
Серхат Озгель
20
Я верю, что вы двое говорите о двух разных вещах. System.Web.HttpContext и статическое свойство: System.Web.Mvc.Controller.HttpContext (у которого нет свойства «Текущее».
Джефф Шелдон,
1
Это работало в среде без MVC, как раз то, что мне было нужно. Спасибо! :)
Вагнер да Силва
38

Вы можете получить имя пользователя в ASP.NET MVC4 следующим образом:

System.Web.HttpContext.Current.User.Identity.Name
radbyx
источник
4
Если вы получаете эту ошибку 'System.Web.HttpContextBase' does not contain a definition for 'Current' and no extension method 'Current' accepting a first argument of type 'System.Web.HttpContextBase' could be found, я бы предложил сделать абсолютный вызов, как это System.Web.HttpContext.Current.User.Identity.Name,.
Простой песочник
21

Я понимаю, что это действительно старая версия, но я только начинаю работать с ASP.NET MVC, поэтому я решил добавить два цента:

  • Request.IsAuthenticated говорит вам, если пользователь аутентифицирован.
  • Page.User.Identity дает вам личность вошедшего в систему пользователя.
JRB
источник
16

Я использую:

Membership.GetUser().UserName

Я не уверен, что это будет работать в ASP.NET MVC, но это стоит попробовать :)

Шон
источник
Откуда этот класс членства? IntelliSense не распознает его по умолчанию.
Серхат Озгель
Пространство имен System.Web.Security. Я не уверен, что это полезно в MVC, но я использую его с элементами управления входом для веб-форм.
Шон
1
Это полезно в любом приложении ASP.NET, которое использует поставщиков членства.
jamiebarrow
2
Это фактически сделает запрос к базе данных. HttpContext.Current.User не имеет.
Майк Коул
11

войти в систему под именем пользователя: System.Web.HttpContext.Current.User.Identity.Name

tifoz
источник
9

Чтобы сослаться на идентификатор пользователя, созданный с использованием простой аутентификации, встроенной в ASP.NET MVC 4 в контроллере для целей фильтрации (что полезно, если вы сначала используете базу данных и Entity Framework 5 для генерации привязок кода и ваши таблицы структурированы так, что внешний ключ к идентификатору пользователя используется), вы можете использовать

WebSecurity.CurrentUserId

как только вы добавите оператор использования

using System.Web.Security;
MattC
источник
4
К сожалению, похоже, это больше не работает в MVC 5. Не знаю, почему = /
Джед Грант
2
System.Security.Principal.WindowsIdentity.GetCurrent().NameРаботает только в MVC 5. Однако это подтягивает доменное имя с именем пользователя. т.е. домен \ имя пользователя
shaz
8

Мы можем использовать следующий код для получения текущего зарегистрированного пользователя в ASP.Net MVC:

var user= System.Web.HttpContext.Current.User.Identity.GetUserName();

Также

var userName = System.Security.Principal.WindowsIdentity.GetCurrent().Name; //will give 'Domain//UserName'

Environment.UserName - Will Display format : 'Username'
Радж Барал
источник
7

Имя пользователя с:

User.Identity.Name

Но если вам нужно получить только идентификатор, вы можете использовать:

using Microsoft.AspNet.Identity;

Таким образом, вы можете получить непосредственно идентификатор пользователя:

User.Identity.GetUserId();
Джилберто Б. Терра младший
источник
Этот метод возвращает System.Guid
Гилберто Б. Терра младший
User.Identity.Name является экземпляром System.Security.Principal.IPrincipal, у которого нет свойства id ... Отличается ли этот пользователь от объекта User пользователя User.Identity.GetUserId
Самра
6

Эта страница может быть тем, что вы ищете:
Использование Page.User.Identity.Name в MVC3

Тебе просто нужно User.Identity.Name.

heriawan
источник
Это работает только внутри контроллера; или если ваша ViewModel наследует от контроллера
полезноBee
5

использование System.Security.Principal.WindowsIdentity.GetCurrent().Name .

Это получит текущего пользователя Windows, вошедшего в систему.

Клей Смит
источник
1
Хотя этот код может ответить на вопрос, было бы лучше включить некоторый контекст, объяснить, как он работает, и описать, когда его использовать. Ответы только для кода бесполезны в долгосрочной перспективе.
ryanyuyu
System.Security.Principal.WindowsIdentity.GetCurrent (). Name возвращает текущего пользователя, вошедшего в Windows, OP запрашивает пользователя, вошедшего в данный момент на веб-сайте.
GrandMasterFlush
4

Для чего это стоит, в ASP.NET MVC 3 вы можете просто использовать User, который возвращает пользователя для текущего запроса.

Pieter
источник
4

Если вы находитесь на своей странице входа в систему, например, в событии LoginUser_LoggedIn, Current.User.Identity.Name вернет пустое значение, поэтому вы должны использовать свойство yourLoginControlName.UserName.

MembershipUser u = Membership.GetUser(LoginUser.UserName);
живи любя
источник
4

Вы можете использовать следующий код:

Request.LogonUserIdentity.Name;
Раджив Джаясвал
источник
Вы получите имя пользователя AppPool, от имени которого выполняется приложение.
Джейсон Гейгер
3
IPrincipal currentUser = HttpContext.Current.User;
bool writeEnable = currentUser.IsInRole("Administrator") ||
        ...
                   currentUser.IsInRole("Operator");
Гедиминас Букаускас
источник
2
var ticket = FormsAuthentication.Decrypt(
                    HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName].Value);

if (ticket.Expired)
{
    throw new InvalidOperationException("Ticket expired.");
}

IPrincipal user =  (System.Security.Principal.IPrincipal) new RolePrincipal(new FormsIdentity(ticket));
Огнян Димитров
источник
2

Если вы работаете в Active Directory в интрасети, вот несколько советов:

(Windows Server 2012)

Запуск всего, что говорит с AD на веб-сервере, требует кучу изменений и терпения. Так как при работе на веб-сервере вместо локального IIS / IIS Express он работает в удостоверении AppPool, поэтому вам необходимо настроить его так, чтобы он выдавал себя за любого, кто попадает на сайт.

Как получить текущего вошедшего в систему пользователя в активном каталоге, когда ваше приложение ASP.NET MVC работает на веб-сервере внутри сети:

// Find currently logged in user
UserPrincipal adUser = null;
using (HostingEnvironment.Impersonate())
{
    var userContext = System.Web.HttpContext.Current.User.Identity;
    PrincipalContext ctx = new PrincipalContext(ContextType.Domain, ConfigurationManager.AppSettings["AllowedDomain"], null,
                                                ContextOptions.Negotiate | ContextOptions.SecureSocketLayer);
    adUser = UserPrincipal.FindByIdentity(ctx, userContext.Name);
}
//Then work with 'adUser' from here...

Вы должны заключить любые вызовы, связанные с «активным контекстом каталога», в следующее, чтобы он действовал как среда размещения для получения информации AD:

using (HostingEnvironment.Impersonate()){ ... }

Вы также должны impersonateустановить значение true в вашем файле web.config:

<system.web>
    <identity impersonate="true" />

Вы должны включить проверку подлинности Windows в файле web.config:

<authentication mode="Windows" />
Бо д'Амор
источник
Я не верю в это, поскольку это явно использует ваши учетные данные пользователя Active Directory. Зачем вам «формы», если вы хотите, чтобы ваши пользователи проходили аутентификацию через AD?
Бо д'Амор
В нашей организации есть места, где у нас есть пара рабочих станций, которые совместно используются несколькими «полевыми» сотрудниками. В связи с этим мы должны добавить страницу входа в наши веб-приложения для интрасети.
Пати Гути
В качестве обходного пути: у вас может быть запущено две копии этого приложения, одна в режиме «Формы» с собственными таблицами идентификации, или вы можете смешать обе в одном приложении, но это сложнее. Быстрый Google обнаружил это: stackoverflow.com/questions/2250921/…
Бо Д'Амор
<identity impersonate = "true" /> может потребоваться изменить при смешивании
Beau D'Amore
2

В Asp.net Mvc Identity 2 вы можете получить текущее имя пользователя:

var username = System.Web.HttpContext.Current.User.Identity.Name;
Ферейдун Барикзехи
источник
1

В диспетчере IIS в разделе Аутентификация отключите: 1) Анонимную аутентификацию 2) Аутентификация с помощью форм

Затем добавьте следующее к своему контроллеру для обработки тестирования по сравнению с развертыванием сервера:

string sUserName = null;
string url = Request.Url.ToString();

if (url.Contains("localhost"))
  sUserName = System.Security.Principal.WindowsIdentity.GetCurrent().Name;
else
  sUserName = User.Identity.Name;
Даниэль Кинг
источник