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?

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.


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


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


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

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.

16

Yo suelo:

Membership.GetUser().UserName

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


¿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


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;

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'

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

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


5

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

Esto obtendrá el usuario actual de Windows conectado.


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.


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

4

Puedes usar el siguiente código:

Request.LogonUserIdentity.Name;

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

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

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

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;

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;
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.