So erhalten Sie den aktuellen Benutzer in ASP.NET MVC


268

In einem Formularmodell habe ich den aktuell angemeldeten Benutzer abgerufen durch:

Page.CurrentUser

Wie erhalte ich den aktuellen Benutzer in einer Controller-Klasse in ASP.NET MVC?

Antworten:


266

Wenn Sie den Benutzer aus dem Controller herausholen müssen, verwenden Sie die UserEigenschaft des Controllers. Wenn Sie es aus der Ansicht benötigen, würde ich das, was Sie speziell benötigen, in das einfügen ViewData, oder Sie könnten einfach User anrufen, da ich denke, dass es eine Eigenschaft von ist ViewPage.


2
"oder Sie können einfach User anrufen, da ich denke, dass es eine Eigenschaft von ViewPage ist" - Meinen Sie also, Page.user zu verwenden, wenn Sie in der Ansicht sind?
Mawaldne

17
Ja, Sie können es wie folgt verwenden: "Hi, @ User.Identity.Name!" in der cshtml.
Sean

198

Ich fand, dass das Userfunktioniert, das heißt, User.Identity.Nameoder User.IsInRole("Administrator").


19
Wenn Sie in einer Klasse außerhalb eines Formulars arbeiten, müssen Sie sich entweder mit Imports System.Webund weiter qualifizieren HttpContext.Current.User.Identity.Nameoder sich direkt mit der vollständigen Syntax qualifizieren:System.Web.HttpContext.Current.User.Identity.Name
Paul

Funktioniert in einem Controller und erbt bei Verwendung eines ViewModels entweder vom Controller oder folgt dem Vorschlag von Paul.
nützlichBee

60

Versuchen Sie es HttpContext.Current.User.

Public Shared Property Current () As System.Web.HttpContext
Mitglied von System.Web.HttpContext

Zusammenfassung:
Ruft das System.Web.HttpContext-Objekt für die aktuelle HTTP-Anforderung ab oder legt dieses fest.

Rückgabewerte:
Der System.Web.HttpContext für die aktuelle HTTP-Anforderung


2
Anscheinend hat HttpContext keine Eigenschaft namens "Current".
Serhat Ozgel

20
Ich glaube, ihr zwei redet über zwei verschiedene Dinge. System.Web.HttpContext und die statische Eigenschaft: System.Web.Mvc.Controller.HttpContext (die keine "aktuelle" Eigenschaft hat.
Jeff Sheldon

1
Das funktionierte in einer Nicht-MVC-Umgebung, genau das, was ich brauchte. Vielen Dank! :)
Wagner da Silva

38

Sie können den Namen des Benutzers in ASP.NET MVC4 folgendermaßen abrufen:

System.Web.HttpContext.Current.User.Identity.Name

4
Wenn Sie diesen Fehler erhalten '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, würde ich vorschlagen, einen absoluten Anruf wie diesen zu tätigen System.Web.HttpContext.Current.User.Identity.Name.
Einfacher Sandmann

21

Mir ist klar, dass dies sehr alt ist, aber ich fange gerade erst mit ASP.NET MVC an, also dachte ich, ich würde meine zwei Cent reinstecken:

  • Request.IsAuthenticated teilt Ihnen mit, ob der Benutzer authentifiziert ist.
  • Page.User.Identity gibt Ihnen die Identität des angemeldeten Benutzers.

16

Ich benutze:

Membership.GetUser().UserName

Ich bin nicht sicher, ob dies in ASP.NET MVC funktioniert, aber es ist einen Versuch wert :)


Woher kommt diese Mitgliedschaftsklasse? IntelliSense erkennt es standardmäßig nicht.
Serhat Ozgel

Der System.Web.Security-Namespace. Ich bin mir nicht sicher, ob dies in MVC nützlich ist, aber ich verwende es mit den Anmeldesteuerelementen für Web Forms.
Sean

1
Dies ist in jeder ASP.NET-Anwendung nützlich, die die Mitgliedschaftsanbieter verwendet.
Jamie Barrow

2
Dadurch wird tatsächlich eine Datenbankanforderung gestellt. HttpContext.Current.User nicht.
Mike Cole

11

Anmelden Benutzername: System.Web.HttpContext.Current.User.Identity.Name


9

Um auf eine Benutzer-ID zu verweisen, die mit einer einfachen Authentifizierung erstellt wurde, die in ASP.NET MVC 4 in einem Controller zu Filterzwecken integriert ist (dies ist hilfreich, wenn Sie zuerst die Datenbank und Entity Framework 5 zum Generieren von Code-First-Bindungen verwenden und Ihre Tabellen so strukturiert sind dass ein Fremdschlüssel für die Benutzer-ID verwendet wird), können Sie verwenden

WebSecurity.CurrentUserId

Sobald Sie eine using-Anweisung hinzufügen

using System.Web.Security;

4
Leider scheint dies in MVC 5 nicht mehr zu funktionieren. Ich bin mir nicht sicher warum = /
Jed Grant

2
Funktioniert nur System.Security.Principal.WindowsIdentity.GetCurrent().Namein MVC 5. Dadurch wird jedoch der Domainname mit dem Benutzernamen aufgerufen. dh Domain \ Benutzername
Shaz

8

Wir können folgenden Code verwenden, um den aktuell angemeldeten Benutzer in ASP.Net MVC abzurufen:

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

Ebenfalls

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

Environment.UserName - Will Display format : 'Username'

7

Benutzername mit:

User.Identity.Name

Wenn Sie jedoch nur die ID benötigen, können Sie Folgendes verwenden:

using Microsoft.AspNet.Identity;

So können Sie direkt die Benutzer-ID erhalten:

User.Identity.GetUserId();

Diese Methode gibt eine System.Guid
Gilberto B. Terra Jr.

User.Identity.Name ist eine Instanz von System.Security.Principal.IPrincipal, die keine ID-Eigenschaft hat ... Unterscheidet sich dieser Benutzer vom User-Objekt von User.Identity.GetUserId
Samra


5

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

Dadurch wird der aktuell angemeldete Windows-Benutzer abgerufen.


1
Während dieser Code die Frage beantworten kann, ist es besser, einen Kontext einzuschließen, zu erklären, wie er funktioniert, und zu beschreiben, wann er verwendet werden soll. Nur-Code-Antworten sind auf lange Sicht nicht sinnvoll.
Ryanyuyu

System.Security.Principal.WindowsIdentity.GetCurrent (). Name gibt den aktuellen Benutzer zurück, der bei Windows angemeldet ist. Das OP fragt nach dem Benutzer, der derzeit auf der Website angemeldet ist.
GrandMasterFlush

4

Für das, was es wert ist, können Sie in ASP.NET MVC 3 einfach Benutzer verwenden, der den Benutzer für die aktuelle Anforderung zurückgibt.


4

Wenn Sie sich auf Ihrer Anmeldeseite befinden, beispielsweise im Ereignis LoginUser_LoggedIn, gibt Current.User.Identity.Name einen leeren Wert zurück, sodass Sie Ihre Eigenschaft LoginControlName.UserName verwenden müssen.

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

4

Sie können folgenden Code verwenden:

Request.LogonUserIdentity.Name;

Dadurch erhalten Sie den Benutzernamen des AppPool, unter dem die Anwendung ausgeführt wird.
Jason Geiger

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

Wenn Sie gerade in Active Directory in einem Intranet arbeiten, finden Sie hier einige Tipps:

(Windows Server 2012)

Das Ausführen von Inhalten, die mit AD auf einem Webserver kommunizieren, erfordert eine Reihe von Änderungen und Geduld. Da die Ausführung auf einem Webserver im Vergleich zu lokalem IIS / IIS Express in der AppPool-Identität ausgeführt wird, müssen Sie sie so einrichten, dass sie sich als derjenige ausgibt, der die Site besucht.

So erhalten Sie den aktuell angemeldeten Benutzer in einem Active Directory, wenn Ihre ASP.NET MVC-Anwendung auf einem Webserver im Netzwerk ausgeführt wird:

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

Sie müssen alle Aufrufe, die mit 'Active Directory-Kontext' zu tun haben, im Folgenden einschließen, damit sie als Hosting-Umgebung fungieren, um die AD-Informationen abzurufen:

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

Sie müssen außerdem impersonatein Ihrer web.config auf true gesetzt haben:

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

Sie müssen die Windows-Authentifizierung in web.config aktiviert haben:

<authentication mode="Windows" />

Ich glaube nicht, da dies explizit Ihre Active Directory-Benutzeranmeldeinformationen verwendet. Warum sollten Sie "Formulare" haben, wenn Sie möchten, dass Ihre Benutzer über AD authentifiziert werden?
Beau D'Amore

In unserer Organisation gibt es Standorte, an denen wir einige Workstations haben, die von mehreren "Außendienstmitarbeitern" gemeinsam genutzt werden. Aus diesem Grund müssen wir die Anmeldeseite zu unseren Intranet-Webanwendungen hinzufügen.
Patee Gutee

Als Problemumgehung: Sie könnten zwei Kopien dieser App ausführen lassen, eine im Formularmodus mit eigenen Identitätstabellen, oder Sie können beide in einer App mischen, aber es ist schwieriger. Eine schnelle Google enthüllte dies: stackoverflow.com/questions/2250921/…
Beau D'Amore

<identity impersonate = "true" /> muss möglicherweise geändert werden, wenn gemischt wird
Beau D'Amore

2

In Asp.net Mvc Identity 2 können Sie den aktuellen Benutzernamen abrufen, indem Sie:

var username = System.Web.HttpContext.Current.User.Identity.Name;

1

Deaktivieren Sie im IIS-Manager unter Authentifizierung: 1) Anonyme Authentifizierung 2) Formularauthentifizierung

Fügen Sie dann Ihrem Controller Folgendes hinzu, um Tests im Vergleich zur Serverbereitstellung durchzuführen:

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

if (url.Contains("localhost"))
  sUserName = System.Security.Principal.WindowsIdentity.GetCurrent().Name;
else
  sUserName = User.Identity.Name;
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.