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?

Serhat Ozgel
quelle

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.

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

Peter Mortensen
quelle
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

Taube
quelle
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
Radbyx
quelle
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.
jrb
quelle
16

Ich benutze:

Membership.GetUser().UserName

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

Sean
quelle
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

Tifoz
quelle
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;
MattC
quelle
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'
Raj Baral
quelle
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();
Gilberto B. Terra Jr.
quelle
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
6

Diese Seite könnte genau das sein, wonach Sie suchen:
Verwenden von Page.User.Identity.Name in MVC3

Du brauchst nur User.Identity.Name.

Heriawan
quelle
Dies funktioniert nur innerhalb eines Controllers. oder wenn Ihr ViewModel von Controller erbt
nützlichBee
5

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

Dadurch wird der aktuell angemeldete Windows-Benutzer abgerufen.

Clay Smith
quelle
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.

Pieter
quelle
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);
Live-Liebe
quelle
4

Sie können folgenden Code verwenden:

Request.LogonUserIdentity.Name;
Rajeev Jayaswal
quelle
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");
Gediminas Bukauskas
quelle
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
quelle
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" />
Beau D'Amore
quelle
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;
Fereydoon Barikzehy
quelle
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;
Daniel King
quelle