Come ottenere l'utente corrente in ASP.NET MVC


268

In un modello di moduli, ho usato per ottenere l'utente che ha effettuato l'accesso:

Page.CurrentUser

Come posso ottenere l'utente corrente all'interno di una classe controller in ASP.NET MVC?

Risposte:


266

Se è necessario richiamare l'utente dal controller, utilizzare la Userproprietà del controller. Se ne hai bisogno dal punto di vista, popolerei ciò di cui hai specificamente bisogno in ViewData, o potresti semplicemente chiamare Utente come penso che sia una proprietà di ViewPage.


2
"o potresti semplicemente chiamare Utente come penso sia una proprietà di ViewPage" - Quindi intendi usare Page.user quando sei nella vista?
mawaldne,

17
Sì, puoi usarlo come "Ciao, @ User.Identity.Name!" nel cshtml.
Sean,

198

Ho scoperto che Userfunziona, cioè User.Identity.Nameo User.IsInRole("Administrator").


19
Solo per aggiungere a questo, se stai lavorando in una classe al di fuori di un modulo dovrai o Imports System.Webqualificarti ulteriormente con HttpContext.Current.User.Identity.Name, o qualificarti direttamente usando la sintassi completa:System.Web.HttpContext.Current.User.Identity.Name
Paul

Funziona all'interno di un controller e se si utilizza un ViewModel ereditare dal controller o seguire il suggerimento di Paul.
utileBee

60

Prova HttpContext.Current.User.

Proprietà condivisa pubblica Current () Come System.Web.HttpContext
Membro di System.Web.HttpContext

Riepilogo:
ottiene o imposta l'oggetto System.Web.HttpContext per la richiesta HTTP corrente.

Valori di ritorno:
System.Web.HttpContext per la richiesta HTTP corrente


2
Apparentemente HttpContext non ha una proprietà chiamata "Current".
Serhat Ozgel,

20
Credo che voi due parliate di due cose diverse. System.Web.HttpContext e la proprietà statica: System.Web.Mvc.Controller.HttpContext (che non ha una proprietà "Current".
Jeff Sheldon,

1
Funzionava su un ambiente non MVC, proprio quello di cui avevo bisogno. Grazie! :)
Wagner da Silva,

38

È possibile ottenere il nome dell'utente in ASP.NET MVC4 in questo modo:

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

4
Se ricevi questo errore '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, suggerirei di effettuare una chiamata assoluta come questa System.Web.HttpContext.Current.User.Identity.Name,.
Semplice Sandman

21

Mi rendo conto che questo è davvero vecchio, ma ho appena iniziato con ASP.NET MVC, quindi ho pensato di inserire i miei due centesimi:

  • Request.IsAuthenticated ti dice se l'utente è autenticato.
  • Page.User.Identity ti dà l'identità dell'utente che ha effettuato l'accesso.

16

Io uso:

Membership.GetUser().UserName

Non sono sicuro che funzionerà in ASP.NET MVC, ma vale la pena provare :)


Da dove viene questa classe di appartenenza? IntelliSense non lo riconosce per impostazione predefinita.
Serhat Ozgel,

Lo spazio dei nomi System.Web.Security. Non sono sicuro che questo sia utile in MVC ma lo uso con i controlli di accesso per i Web Form.
Sean,

1
È utile in qualsiasi applicazione ASP.NET che utilizza i provider di appartenenze.
jamiebarrow,

2
Questo effettivamente farà una richiesta di database. HttpContext.Current.User no.
Mike Cole,

11

ottenere l'accesso nome utente: System.Web.HttpContext.Current.User.Identity.Name


9

Per fare riferimento a un ID utente creato utilizzando un'autenticazione semplice integrata in ASP.NET MVC 4 in un controller per scopi di filtraggio (che è utile se si utilizza prima il database e Entity Framework 5 per generare associazioni in codice e le tabelle sono strutturate in modo tale che viene utilizzata una chiave esterna per userID), è possibile utilizzare

WebSecurity.CurrentUserId

una volta aggiunta un'istruzione using

using System.Web.Security;

4
Sfortunatamente questo non sembra funzionare più in MVC 5. Non so perché = /
Jed Grant il

2
System.Security.Principal.WindowsIdentity.GetCurrent().NameFunziona solo in MVC 5. Tuttavia, questo richiama il nome di dominio con il nome utente. cioè dominio \ nome utente
shaz

8

Possiamo utilizzare il seguente codice per ottenere l'utente attualmente connesso in ASP.Net MVC:

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

Anche

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

Environment.UserName - Will Display format : 'Username'

7

Nome utente con:

User.Identity.Name

Ma se hai bisogno di ottenere solo l'ID, puoi usare:

using Microsoft.AspNet.Identity;

Quindi, puoi ottenere direttamente l'ID utente:

User.Identity.GetUserId();

Questo metodo restituisce un System.Guid
Gilberto B. Terra Jr.

User.Identity.Name è un'istanza di System.Security.Principal.IPrincipal che non ha una proprietà id ... È questo utente diverso dall'oggetto Utente di User.Identity.GetUserId
Samra


5

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

Ciò otterrà l'utente di Windows attualmente connesso.


1
Sebbene questo codice possa rispondere alla domanda, sarebbe meglio includere un certo contesto, spiegare come funziona e descrivere quando usarlo. Le risposte di solo codice non sono utili a lungo termine.
Ryanuyu,

System.Security.Principal.WindowsIdentity.GetCurrent (). Nome restituisce l'utente corrente connesso a Windows, l'OP chiede l'utente attualmente connesso al sito web.
GrandMasterFlush

4

Per quello che vale, in ASP.NET MVC 3 puoi semplicemente usare Utente che restituisce l'utente per la richiesta corrente.


4

Se ti trovi all'interno della tua pagina di accesso, ad esempio LoginUser_LoggedIn, Current.User.Identity.Name restituirà un valore vuoto, quindi devi utilizzare la proprietàLoginControlName.UserName.

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

4

Puoi usare il seguente codice:

Request.LogonUserIdentity.Name;

Questo ti dà il nome utente dell'AppPool con cui l'applicazione è in esecuzione.
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

Se ti capita di lavorare in Active Directory su una rete Intranet, ecco alcuni suggerimenti:

(Windows Server 2012)

L'esecuzione di tutto ciò che comunica con AD su un server Web richiede un sacco di cambiamenti e pazienza. Dal momento che quando è in esecuzione su un server Web rispetto a IIS / IIS Express locale, viene eseguito nell'identità dell'AppPool, quindi è necessario configurarlo per impersonare chiunque acceda al sito.

Come ottenere l'utente attualmente connesso in una directory attiva quando l'applicazione ASP.NET MVC è in esecuzione su un server Web all'interno della rete:

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

È necessario racchiudere tutte le chiamate che hanno a che fare con "contesto di directory attiva" di seguito, in modo che funga da ambiente di hosting per ottenere le informazioni AD:

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

Devi anche aver impersonateimpostato su true nel tuo web.config:

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

È necessario disporre dell'autenticazione di Windows attiva in web.config:

<authentication mode="Windows" />

Non ci credo, poiché utilizza esplicitamente le credenziali dell'utente di Active Directory. Perché dovresti avere "Moduli" se desideri che i tuoi utenti vengano autenticati tramite AD?
Beau D'Amore,

Nella nostra organizzazione, ci sono luoghi in cui abbiamo un paio di postazioni di lavoro condivise da diversi membri del personale "sul campo". Per questo motivo, siamo tenuti ad aggiungere la pagina di accesso alle nostre applicazioni Web Intranet.
Patee Gutee,

come soluzione alternativa: potresti avere due copie di questa app in esecuzione, una in modalità "Moduli" con le sue tabelle di identità o puoi combinare entrambe in un'unica app, ma è più complicata. Un rapido google ha rivelato questo: stackoverflow.com/questions/2250921/…
Beau D'Amore,

<identity impersonate = "true" /> potrebbe dover cambiare se si mescola
Beau D'Amore,

2

In Asp.net Mvc Identity 2, è possibile ottenere il nome utente corrente tramite:

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

1

In Gestione IIS, in Autenticazione, disabilitare: 1) Autenticazione anonima 2) Autenticazione moduli

Quindi aggiungere quanto segue al controller, per gestire i test rispetto alla distribuzione del server:

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

if (url.Contains("localhost"))
  sUserName = System.Security.Principal.WindowsIdentity.GetCurrent().Name;
else
  sUserName = User.Identity.Name;
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.