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


268

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

Page.CurrentUser

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

Ответы:


266

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


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

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 дает вам личность вошедшего в систему пользователя.

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


9

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

WebSecurity.CurrentUserId

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

using System.Web.Security;

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
Самра


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, который возвращает пользователя для текущего запроса.


4

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

MembershipUser u = Membership.GetUser(LoginUser.UserName);



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


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;
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.