Як отримати поточного користувача в ASP.NET MVC


268

У моделі форм я використовував для отримання поточного користувача, який увійшов у систему:

Page.CurrentUser

Як отримати поточного користувача в клас контролера в ASP.NET MVC?

Відповіді:


266

Якщо вам потрібно отримати користувача зсередини контролера, використовуйте Userвластивість Controller. Якщо вам це потрібно з подання, я б заповнив те, що вам конкретно потрібно ViewData, або ви можете просто зателефонувати користувачеві, оскільки я думаю, що це властивість ViewPage.


2
"або ви можете просто зателефонувати користувачеві, оскільки я думаю, що це властивість ViewPage" - Так ви маєте на увазі використовувати Page.user, коли ви переглядаєте?
mawaldne

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, то успадковуйте його від Controller або виконайте пропозиції Павла.
корисноBee

60

Спробуйте HttpContext.Current.User.

Публічна спільна власність власності () як 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 (У якої немає властивості "Current".
Джефф Шелдон

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 для генерації прив'язок перших кодів, а ваші таблиці структуровані так що використовується іноземний ключ до userID), ви можете використовувати

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
Gilberto B. Terra Jr.

User.Identity.Name - це екземпляр System.Security.Principal.IPrincipal, який не має властивості ідентифікатора ... Чи відрізняється цей Користувач від User.Identity.GetUserId 's User object
Samra


5

Використовуйте System.Security.Principal.WindowsIdentity.GetCurrent().Name.

Це отримає поточного користувача Windows.


1
Хоча цей код може відповісти на питання, було б краще включити деякий контекст, пояснити, як він працює, та описати, коли ним користуватися. Відповіді, що стосуються лише коду, в довгостроковій перспективі не корисні.
рянюю

System.Security.Principal.WindowsIdentity.GetCurrent (). Ім'я повертає поточного користувача, який увійшов у Windows, ОП запитує користувача, який зараз увійшов на веб-сайт.
GrandMasterFlush

4

Для чого це варто, в ASP.NET MVC 3 ви можете просто користувач, який повертає користувача для поточного запиту.


4

Якщо ви перебуваєте на своїй сторінці входу, наприклад, у події LoginUser_LoggedIn, Current.User.Identity.Name поверне порожнє значення, тому вам доведеться використовувати властивістьLoginControlName.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 у веб.config:

<authentication mode="Windows" />

Я не вірю в це, оскільки це явно використовує ваші облікові дані Active Directory. Чому у вас з'явиться "Форми", якщо ви хочете, щоб ваші користувачі пройшли автентифікацію через AD?
Beau D'Amore

У нашій організації є місця, де у нас є кілька робочих станцій, якими ділиться декілька «польових» співробітників. Через це від нас вимагається додати сторінку входу до веб-додатків інтранет.
Patee Gutee

як вирішення: у вас можуть працювати дві копії цього додатка, одна в режимі "Форми" зі своїми власними таблицями посвідчень або ви можете змішати обидві в одному додатку, але це складніше. Швидкий google виявив це: stackoverflow.com/questions/2250921/…
Beau D'Amore

<ідентифікація 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.