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


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.


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").


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


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

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.

16

Używam:

Membership.GetUser().UserName

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


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


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;

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'

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();

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.


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.


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);


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

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

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;

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;
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.