Как получить текущего пользователя в 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.