Jak uzyskać bieżącego użytkownika w ASP.NET MVC

268

W modelu formularzy uzywałem bieżącego zalogowanego użytkownika poprzez:

Page.CurrentUser

Jak uzyskać bieżącego użytkownika w klasie kontrolera w ASP.NET MVC?

Serhat Ozgel
źródło

Odpowiedzi:

266

Jeśli chcesz uzyskać użytkownika z poziomu kontrolera, skorzystaj z Userwłaściwości kontrolera. Jeśli potrzebujesz tego z widoku, wypełniłbym to, czego konkretnie potrzebujesz ViewData, lub możesz po prostu zadzwonić do użytkownika, ponieważ uważam, że jest to właściwość ViewPage.

Haacked
źródło
2
„lub możesz po prostu zadzwonić do użytkownika, ponieważ uważam, że jest to właściwość ViewPage” - więc masz na myśli użycie Page.user, gdy jesteś w widoku?
mawaldne
17
Tak, możesz używać go w stylu „Cześć, @ User.Identity.Name!” w pliku cshtml.
Sean
198

Znalazłem, że Userdziała, to znaczy, User.Identity.Namelub User.IsInRole("Administrator").

Peter Mortensen
źródło
19
Dodajmy do tego, że jeśli pracujesz w klasie poza formą, musisz albo Imports System.Webdalej się kwalifikować HttpContext.Current.User.Identity.Name, albo bezpośrednio zakwalifikować, korzystając z pełnej składni:System.Web.HttpContext.Current.User.Identity.Name
Paul
Działa wewnątrz kontrolera i jeśli używasz ViewModel, albo dziedziczy po kontrolerze, albo postępujesz zgodnie z sugestią Paula.
przydatneBee
60

Spróbować HttpContext.Current.User.

Public Shared Property Current () As System.Web.HttpContext
Członek System.Web.HttpContext

Podsumowanie:
Pobiera lub ustawia obiekt System.Web.HttpContext dla bieżącego żądania HTTP.

Zwracane wartości:
System.Web.HttpContext dla bieżącego żądania HTTP

gołąb
źródło
2
Najwyraźniej HttpContext nie ma właściwości o nazwie „Bieżący”.
Serhat Ozgel,
20
Wierzę, że rozmawiacie o dwóch różnych rzeczach. System.Web.HttpContext i właściwość statyczna: System.Web.Mvc.Controller.HttpContext (która nie ma właściwości „Bieżącej”.
Jeff Sheldon,
1
To działało w środowisku innym niż MVC, dokładnie to, czego potrzebowałem. Dzięki! :)
Wagner da Silva
38

Możesz uzyskać nazwę użytkownika w ASP.NET MVC4 w następujący sposób:

System.Web.HttpContext.Current.User.Identity.Name
radbyx
źródło
4
Jeśli otrzymujesz ten błąd '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, chciałbym zaproponować dokonanie bezwzględnej takiego połączenia, System.Web.HttpContext.Current.User.Identity.Name.
Prosty Sandman
21

Zdaję sobie sprawę, że to naprawdę stare, ale dopiero zaczynam pracę z ASP.NET MVC, więc pomyślałem, że wsadzę dwa centy:

  • Request.IsAuthenticated informuje, czy użytkownik jest uwierzytelniony.
  • Page.User.Identity daje tożsamość zalogowanego użytkownika.
jrb
źródło
16

Używam:

Membership.GetUser().UserName

Nie jestem pewien, czy to zadziała w ASP.NET MVC, ale warto spróbować :)

Sean
źródło
Skąd pochodzi ta klasa członkostwa? IntelliSense domyślnie go nie rozpoznaje.
Serhat Ozgel,
Przestrzeń nazw System.Web.Security. Nie jestem pewien, czy jest to przydatne w MVC, ale używam go z kontrolkami logowania do formularzy internetowych.
Sean
1
Jest przydatny w każdej aplikacji ASP.NET korzystającej z dostawców członkostwa.
jamiebarrow,
2
To faktycznie spowoduje żądanie bazy danych. HttpContext.Current.User nie.
Mike Cole,
11

zalogowanie się do nazwy użytkownika: System.Web.HttpContext.Current.User.Identity.Name

tifoz
źródło
9

Aby odwołać się do identyfikatora użytkownika utworzonego przy użyciu prostego uwierzytelniania wbudowanego w ASP.NET MVC 4 w kontrolerze do celów filtrowania (co jest pomocne, jeśli najpierw używasz bazy danych i Entity Framework 5 do generowania powiązań z kodem, a tabele mają taką strukturę) że używany jest klucz obcy do ID użytkownika), możesz użyć

WebSecurity.CurrentUserId

po dodaniu instrukcji using

using System.Web.Security;
MattC
źródło
4
Niestety wydaje się, że to już nie działa w MVC 5. Nie jestem pewien, dlaczego = /
Jed Grant
2
System.Security.Principal.WindowsIdentity.GetCurrent().NameDziała tylko w MVC 5. Jednak to podnosi nazwę domeny z nazwą użytkownika. tzn. domena \ nazwa użytkownika
shaz
8

Możemy użyć następującego kodu, aby uzyskać bieżącego zalogowanego użytkownika w ASP.Net MVC:

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

Również

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

Environment.UserName - Will Display format : 'Username'
Raj Baral
źródło
7

Nazwa użytkownika z:

User.Identity.Name

Ale jeśli potrzebujesz tylko identyfikatora, możesz użyć:

using Microsoft.AspNet.Identity;

Możesz więc uzyskać bezpośrednio identyfikator użytkownika:

User.Identity.GetUserId();
Gilberto B. Terra Jr.
źródło
Ta metoda zwraca System.Guid
Gilberto B. Terra Jr.
User.Identity.Name jest instancją System.Security.Principal.IPrincipal, która nie ma właściwości id ... Czy ten użytkownik jest inny niż obiekt użytkownika User.Identity.GetUserId
Samra
5

Zastosowanie System.Security.Principal.WindowsIdentity.GetCurrent().Name.

Spowoduje to, że bieżący zalogowany użytkownik systemu Windows.

Clay Smith
źródło
1
Chociaż ten kod może odpowiedzieć na pytanie, lepiej byłoby dołączyć jakiś kontekst, wyjaśnić, jak działa i opisać, kiedy go użyć. Odpowiedzi zawierające tylko kod nie są przydatne na dłuższą metę.
ryanyuyu,
System.Security.Principal.WindowsIdentity.GetCurrent (). Nazwa zwraca bieżącego użytkownika zalogowanego do systemu Windows, OP prosi o zalogowanie użytkownika na stronie internetowej.
GrandMasterFlush,
4

Za to, co jest warte, w ASP.NET MVC 3 możesz po prostu użyć opcji Użytkownik, która zwraca użytkownika dla bieżącego żądania.

Pieter
źródło
4

Jeśli znajdujesz się na stronie logowania, na przykład w zdarzeniu LoginUser_LoggedIn, Current.User.Identity.Name zwróci pustą wartość, więc musisz użyć swojej właściwościLoginControlName.UserName.

MembershipUser u = Membership.GetUser(LoginUser.UserName);
żywa miłość
źródło
4

Możesz użyć następującego kodu:

Request.LogonUserIdentity.Name;
Rajeev Jayaswal
źródło
W ten sposób otrzymujesz nazwę użytkownika AppPool, jako aplikację.
Jason Geiger
3
IPrincipal currentUser = HttpContext.Current.User;
bool writeEnable = currentUser.IsInRole("Administrator") ||
        ...
                   currentUser.IsInRole("Operator");
Gediminas Bukauskas
źródło
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));
Ognyan Dimitrov
źródło
2

Jeśli akurat pracujesz w usłudze Active Directory w intranecie, oto kilka wskazówek:

(Windows Server 2012)

Uruchamianie czegokolwiek, co komunikuje się z AD na serwerze WWW, wymaga wielu zmian i cierpliwości. Ponieważ podczas uruchamiania na serwerze sieciowym kontra lokalny IIS / IIS Express działa w tożsamości AppPool, więc musisz go skonfigurować, aby podszywał się pod każdego, kto wejdzie na stronę.

Jak uzyskać bieżącego zalogowanego użytkownika w aktywnym katalogu, gdy aplikacja ASP.NET MVC działa na serwerze sieciowym w sieci:

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

Musisz zawrzeć wszystkie wywołania związane z „kontekstem katalogu aktywnego” w następujący sposób, aby działało ono jako środowisko hostingowe, aby uzyskać informacje AD:

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

Musisz także impersonateustawić wartość true w swoim pliku web.config:

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

Musisz mieć uwierzytelnianie systemu Windows w pliku web.config:

<authentication mode="Windows" />
Beau D'Amore
źródło
Nie wierzę w to, ponieważ jawnie korzysta z poświadczeń użytkownika usługi Active Directory. Dlaczego miałbyś mieć „Formularze”, jeśli chcesz, aby Twoi użytkownicy byli uwierzytelniani przez AD?
Beau D'Amore
W naszej organizacji istnieją lokalizacje, w których mamy kilka stacji roboczych, które są wspólne dla kilku pracowników „terenowych”. Z tego powodu musimy dodać stronę logowania do naszych intranetowych aplikacji internetowych.
Patee Gutee
jako obejście problemu: możesz mieć uruchomione dwie kopie tej aplikacji, jedną w trybie „Formularze” z własnymi tabelami tożsamości lub możesz mieszać obie w jednej aplikacji, ale jest to trudniejsze. Szybkie google ujawniło to: stackoverflow.com/questions/2250921/...
Beau D'Amore
<tożsamość personifikująca = "prawda" /> może wymagać zmiany w przypadku miksowania
Beau D'Amore
2

W Asp.net Mvc Identity 2 możesz uzyskać bieżącą nazwę użytkownika poprzez:

var username = System.Web.HttpContext.Current.User.Identity.Name;
Fereydoon Barikzehy
źródło
1

W Menedżerze IIS w obszarze Uwierzytelnianie wyłącz: 1) Uwierzytelnianie anonimowe 2) Uwierzytelnianie formularzy

Następnie dodaj do kontrolera następujące elementy, aby obsłużyć testowanie i wdrożenie serwera:

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

if (url.Contains("localhost"))
  sUserName = System.Security.Principal.WindowsIdentity.GetCurrent().Name;
else
  sUserName = User.Identity.Name;
Daniel King
źródło