Cómo obtener el usuario actual en ASP.NET MVC

268

En un modelo de formularios, solía obtener el usuario registrado actualmente por:

Page.CurrentUser

¿Cómo consigo al usuario actual dentro de una clase de controlador en ASP.NET MVC?

Serhat Ozgel
fuente

Respuestas:

266

Si necesita obtener el usuario desde el controlador, use la Userpropiedad del controlador. Si lo necesita desde la vista, llenaría lo que necesita específicamente en el ViewData, o simplemente podría llamar a Usuario, ya que creo que es una propiedad de ViewPage.

Hackeado
fuente
2
"o simplemente puede llamar a Usuario, ya que creo que es una propiedad de ViewPage". ¿Quiere decir que usa Page.user cuando está en la vista?
mawaldne
17
Sí, puede usarlo como "Hola, @ User.Identity.Name!" en el cshtml
Sean
198

Descubrí que Userfunciona, es decir, User.Identity.Nameo User.IsInRole("Administrator").

Peter Mortensen
fuente
19
Solo para agregar a esto, si está trabajando en una clase fuera de un formulario, necesitará Imports System.Weby calificará aún más HttpContext.Current.User.Identity.Name, o calificará directamente usando la sintaxis completa:System.Web.HttpContext.Current.User.Identity.Name
Paul
Funciona dentro de un controlador y, si usa un modelo de vista, herede del controlador o siga la sugerencia de Paul.
útilBee
60

Tratar HttpContext.Current.User.

Public Shared Property Current () Como System.Web.HttpContext
Miembro de System.Web.HttpContext

Resumen:
Obtiene o establece el objeto System.Web.HttpContext para la solicitud HTTP actual.

Valores devueltos:
El System.Web.HttpContext para la solicitud HTTP actual

paloma
fuente
2
Aparentemente, HttpContext no tiene una propiedad llamada "Current".
Serhat Ozgel el
20
Creo que ustedes dos están hablando de dos cosas diferentes. System.Web.HttpContext y la propiedad estática: System.Web.Mvc.Controller.HttpContext (que no tiene una propiedad "Actual".
Jeff Sheldon
1
Eso funcionó en un entorno no MVC, justo lo que necesitaba. ¡Gracias! :)
Wagner da Silva
38

Puede obtener el nombre del usuario en ASP.NET MVC4 de esta manera:

System.Web.HttpContext.Current.User.Identity.Name
radbyx
fuente
44
Si recibe este error '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, le sugiero que haga una llamada absoluta como esta System.Web.HttpContext.Current.User.Identity.Name,.
Simple Sandman
21

Me doy cuenta de que esto es muy antiguo, pero recién estoy comenzando con ASP.NET MVC, así que pensé en meter mis dos centavos:

  • Request.IsAuthenticated le dice si el usuario está autenticado.
  • Page.User.Identity le proporciona la identidad del usuario conectado.
jrb
fuente
16

Yo suelo:

Membership.GetUser().UserName

No estoy seguro de que esto funcione en ASP.NET MVC, pero vale la pena intentarlo :)

Sean
fuente
¿De dónde viene esta clase de Membresía? IntelliSense no lo reconoce por defecto.
Serhat Ozgel el
El espacio de nombres System.Web.Security. No estoy seguro de que esto sea útil en MVC, pero lo uso con los controles de inicio de sesión para Web Forms.
Sean
1
Es útil en cualquier aplicación ASP.NET que use los proveedores de Membresía.
jamiebarrow
2
Esto realmente hará una solicitud de base de datos. HttpContext.Current.User no lo hace.
Mike Cole
11

iniciar sesión nombre de usuario: System.Web.HttpContext.Current.User.Identity.Name

tifoz
fuente
9

Para hacer referencia a una ID de usuario creada usando una autenticación simple integrada en ASP.NET MVC 4 en un controlador para fines de filtrado (lo cual es útil si está utilizando primero la base de datos y Entity Framework 5 para generar enlaces de código primero y sus tablas están estructuradas de modo que que se usa una clave externa para el ID de usuario), puede usar

WebSecurity.CurrentUserId

una vez que agregue una declaración de uso

using System.Web.Security;
MattC
fuente
44
Desafortunadamente, esto ya no parece funcionar en MVC 5. No estoy seguro de por qué = /
Jed Grant
2
Solo System.Security.Principal.WindowsIdentity.GetCurrent().Namefunciona en MVC 5. Sin embargo, eso muestra el nombre de dominio con el nombre de usuario. es decir, dominio \ nombre de usuario
shaz
8

Podemos usar el siguiente código para obtener el usuario conectado actualmente en ASP.Net MVC:

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

también

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

Environment.UserName - Will Display format : 'Username'
Raj Baral
fuente
7

Nombre de usuario con:

User.Identity.Name

Pero si necesita obtener solo la identificación, puede usar:

using Microsoft.AspNet.Identity;

Entonces, puede obtener directamente la ID de usuario:

User.Identity.GetUserId();
Gilberto B. Terra Jr.
fuente
Este método devuelve un System.Guid
Gilberto B. Terra Jr. el
User.Identity.Name es una instancia de System.Security.Principal.IPrincipal que no tiene una propiedad de identificación ... ¿Es este usuario diferente del objeto de usuario User.Identity.GetUserId?
Samra
6

Esta página podría ser lo que está buscando:
Usar Page.User.Identity.Name en MVC3

Sólo se necesita User.Identity.Name.

Heriawan
fuente
Esto funciona solo dentro de un controlador; o si su ViewModel hereda del controlador
útilBee
5

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

Esto obtendrá el usuario actual de Windows conectado.

Clay Smith
fuente
1
Si bien este código puede responder la pregunta, sería mejor incluir algo de contexto, explicar cómo funciona y describir cuándo usarlo. Las respuestas de solo código no son útiles a largo plazo.
ryanyuyu
System.Security.Principal.WindowsIdentity.GetCurrent (). Name devuelve el usuario actual conectado a Windows, el OP pregunta por el usuario actualmente conectado al sitio web.
GrandMasterFlush
4

Para lo que vale, en ASP.NET MVC 3 solo puede usar Usuario, que devuelve al usuario para la solicitud actual.

Pieter
fuente
4

Si está dentro de su página de inicio de sesión, en el evento LoginUser_LoggedIn, por ejemplo, Current.User.Identity.Name devolverá un valor vacío, por lo que debe usar la propiedad yourLoginControlName.UserName.

MembershipUser u = Membership.GetUser(LoginUser.UserName);
vive el amor
fuente
4

Puedes usar el siguiente código:

Request.LogonUserIdentity.Name;
Rajeev Jayaswal
fuente
Esto le proporciona el nombre de usuario del AppPool con el que se ejecuta la aplicación.
Jason Geiger
3
IPrincipal currentUser = HttpContext.Current.User;
bool writeEnable = currentUser.IsInRole("Administrator") ||
        ...
                   currentUser.IsInRole("Operator");
Gediminas Bukauskas
fuente
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
fuente
2

Si está trabajando en Active Directory en una intranet, aquí hay algunos consejos:

(Windows Server 2012)

Ejecutar cualquier cosa que hable con AD en un servidor web requiere muchos cambios y paciencia. Dado que cuando se ejecuta en un servidor web frente a IIS / IIS Express local, se ejecuta en la identidad del AppPool, por lo que debe configurarlo para suplantar a quien visita el sitio.

Cómo obtener el usuario con sesión iniciada actual en un directorio activo cuando su aplicación ASP.NET MVC se ejecuta en un servidor web dentro de la red:

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

Debe ajustar las llamadas que tengan que ver con el 'contexto de directorio activo' a continuación para que actúe como el entorno de alojamiento para obtener la información de AD:

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

También debe haber impersonateestablecido en verdadero en su web.config:

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

Debe tener la autenticación de Windows activada en web.config:

<authentication mode="Windows" />
Beau D'Amore
fuente
No lo creo, ya que esto está utilizando explícitamente sus credenciales de usuario de Active Directory. ¿Por qué tendría 'Formularios' si desea que sus usuarios se autentiquen a través de AD?
Beau D'Amore
En nuestra organización, hay ubicaciones donde tenemos un par de estaciones de trabajo que son compartidas por varios miembros del personal "de campo". Por eso, estamos obligados a agregar la página de inicio de sesión a nuestras aplicaciones web de intranet.
Patee Gutee
Como solución alternativa: podría tener dos copias de esta aplicación ejecutándose, una en modo 'Formularios' con sus propias tablas de identidad o puede mezclar ambas en una aplicación, pero es más complicado. Un rápido google reveló esto: stackoverflow.com/questions/2250921/…
Beau D'Amore
<identity impersonate = "true" /> podría necesitar cambiar si se mezcla
Beau D'Amore
2

En Asp.net Mvc Identity 2, puede obtener el nombre de usuario actual al:

var username = System.Web.HttpContext.Current.User.Identity.Name;
Fereydoon Barikzehy
fuente
1

En el Administrador de IIS, en Autenticación, deshabilite: 1) Autenticación anónima 2) Autenticación de formularios

Luego agregue lo siguiente a su controlador, para manejar las pruebas versus la implementación del servidor:

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
fuente