¿Cómo obtener el usuario actual y cómo usar la clase de usuario en MVC5?

159
  • ¿Cómo puedo obtener la identificación del usuario actualmente conectado? MVC 5 ? Intenté las sugerencias de StackOverflow, pero parecen no ser para MVC 5.
  • Además, ¿cuál es la mejor práctica de MVC 5 de asignar cosas a los usuarios? (por ejemplo, una Userdebe tener Items. debo guardar del usuario Iden Item? ¿Puedo extender la Userclase con una List<Item>propiedad de navegación?

Estoy usando "Cuentas de usuario individual" de la plantilla MVC.

Probé estos:

'Membership.GetUser ()' es nulo.

Adam Szabo
fuente
Se agregaron las referencias de lo que he intentado. El último estuvo bien en MVC4 pero no en MVC5. También necesito algunas buenas prácticas de "uso de usuario" :)
Adam Szabo
Cuando dice que está utilizando MVC 5, ¿qué está utilizando para ser miembro? OWin.Security?
Aron
"Cuentas de usuario individuales" de la plantilla MVC.
Adam Szabo
3
HttpContext.Current.User.Identity.Namees el nombre del usuario actualmente registrado.
Wiktor Zychla
1
¿Cómo obtener la identificación ? Me gustaría asignar el usuario actual al Itemque crea, pero no en función del nombre de usuario (eso podría cambiar). No funciona por la forma en que 'HttpContext.Current' System.Web.HttpContextBase 'no contiene una definición para' Current 'y no se puede encontrar ningún método de extensión' Current 'que acepte un primer argumento de tipo' System.Web.HttpContextBase '( ¿Le falta una directiva de uso o una referencia de ensamblado?) `. ¿Estás seguro de que tu solución es para MVC 5?
Adam Szabo

Respuestas:

313

Si está codificando en un controlador ASP.NET MVC, use

using Microsoft.AspNet.Identity;

...

User.Identity.GetUserId();

Vale la pena mencionar que User.Identity.IsAuthenticated y User.Identity.Namefuncionará sin agregar la usingdeclaración mencionada anteriormente . Pero GetUserId()no estará presente sin él.

Si está en una clase que no sea un controlador, use

HttpContext.Current.User.Identity.GetUserId();

En la plantilla predeterminada de MVC 5, la ID de usuario es un GUID almacenado como una cadena.

Todavía no hay mejores prácticas, pero encontré información valiosa sobre cómo extender el perfil de usuario:

Adam Szabo
fuente
9
La autenticación y autorización del usuario han cambiado para ASP.NET MVC 5. Ahora es una autenticación basada en notificaciones con interfaces y repositorios genéricos que puede usar con EF u otro proveedor (la implementación de EF viene por defecto). Dado que GetUserIdes un método de extensión almacenado en la parte inferior Ass_Start\IdentityConfig.cs, donde sea que necesite usarlo, si se encuentra en un espacio de nombres diferente, tendrá que configurar el using Microsoft.AspNet.Identitypara que la extensión sea visible.
Anderson Matos
1
survey.UserId = Guid.Parse (User.Identity.GetUserId ());
NicoJuicy
Si agrego la referencia de uso, ¿el usuario sigue subrayado en rojo? ¿Por qué sería esto?
Zapnologica
@Zapnologica: intente reconstruir el proyecto, tal vez VS IntelliSense sea un poco lento.
Adam Szabo
55
NOTA El usuario solo está disponible en un controlador msdn.microsoft.com/en-us/library/… (@Zapnologica ¿lo está utilizando fuera de un controlador? Pruebe HttpContext.Current.User.Identity.GetUserId ();)
Adween
28

Intenta algo como:

var store = new UserStore<ApplicationUser>(new ApplicationDbContext());
var userManager = new UserManager<ApplicationUser>(store);
ApplicationUser user = userManager.FindByNameAsync(User.Identity.Name).Result;

Funciona con RTM.

Rok Bermež
fuente
11
Impone un viaje innecesario a la base de datos.
Arash
3
@Arash, ¿cómo se supone que la aplicación obtiene el objeto del usuario sin contactar con la base de datos?
fabspro
2
@Arash no importa, entiendo lo que quieres decir. La ID se puede recuperar con User.Identity.GetUserId (); sin ningún viaje de base de datos.
fabspro
Recuerde con mvc5 (membresía 2): User.Identity.GetUserId () es diferente con la identificación en la tabla [AspNetUsers]. Entonces Jakub Arnold y Rok están en la forma correcta
Grey Wolf
Estoy un poco confundido con la respuesta. Estoy obteniendo un tipo de UserStore que no parece existir en el contexto de mi controlador. ¿Algunas ideas?
Jhourlad Estrella
19

Si desea el objeto ApplicationUser en una línea de código (si tiene instalada la última identidad ASP.NET), intente:

ApplicationUser user = System.Web.HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>().FindById(System.Web.HttpContext.Current.User.Identity.GetUserId());

Necesitará lo siguiente usando declaraciones:

using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.Owin;
Firecape
fuente
Objeto no encontrado para <ApplicationUserManager>
Fandango68
7

Obtener el Id es bastante sencillo y lo has resuelto.

Sin embargo, su segunda pregunta es un poco más complicada.

Por lo tanto, todo esto es una versión preliminar en este momento, pero el problema común que enfrenta es dónde está extendiendo al usuario con nuevas propiedades (o una colección de Artículos en su pregunta).

Fuera de la caja obtendrá un archivo llamado IdentityModelen la carpeta Modelos (en el momento de la escritura). Ahí tienes un par de clases; ApplicationUsery ApplicationDbContext. Para agregar su colección de Itemsquerrá modificar elApplicationUser clase, tal como lo haría si fuera una clase normal que estaba usando con Entity Framework. De hecho, si echa un vistazo rápido debajo del capó, encontrará que todas las clases relacionadas con la identidad (Usuario, Rol, etc.) son solo POCO ahora con las anotaciones de datos apropiadas para que funcionen bien con EF6.

A continuación, deberá realizar algunos cambios en el AccountControllerconstructor para que sepa usar su DbContext.

public AccountController()
{
    IdentityManager = new AuthenticationIdentityManager(
    new IdentityStore(new ApplicationDbContext()));
}

Ahora, para ser honesto, obtener un objeto de usuario completo para su usuario conectado es un poco esotérico.

    var userWithItems = (ApplicationUser)await IdentityManager.Store.Users
    .FindAsync(User.Identity.GetUserId(), CancellationToken.None);

Esa línea hará el trabajo y podrás acceder userWithItems.Items como quieras.

HTH

Ochenta y uno
fuente
Supongo que no hay nada como documentos de prelanzamiento para todo esto.
Derek Tomes
@Derek Tomes - No es que me haya encontrado. Creo que tendremos que esperar hasta el 13 de noviembre para documentos reales. No ha sido genial para ser honesto, incluso hay una solicitud de mejor orientación en uservoice - aspnet.uservoice.com/forums/41199-general-asp-net/suggestions/…
EightyOne Unite
ok, pero ¿cómo llego a una instancia de tipo AccountController?
nido
0

Siento tu dolor, estoy tratando de hacer lo mismo. En mi caso solo quiero borrar al usuario.

He creado una clase de controlador base de la que todos mis controladores heredan. En él anulo OnAuthenticationy configuro elfilterContext.HttpContext.User to null

Eso es lo mejor que he logrado hasta ahora ...

public abstract class ApplicationController : Controller   
{
    ...
    protected override void OnAuthentication(AuthenticationContext filterContext)
    {
        base.OnAuthentication(filterContext); 

        if ( ... )
        {
            // You may find that modifying the 
            // filterContext.HttpContext.User 
            // here works as desired. 
            // In my case I just set it to null
            filterContext.HttpContext.User = null;
        }
    }
    ...
}
Derek Tomes
fuente
0
        string userName="";
        string userId = "";
        int uid = 0;
        if (HttpContext.Current != null && HttpContext.Current.User != null
                  && HttpContext.Current.User.Identity.Name != null)
        {
            userName = HttpContext.Current.User.Identity.Name;              
        }
        using (DevEntities context = new DevEntities())
        {

              uid = context.Users.Where(x => x.UserName == userName).Select(x=>x.Id).FirstOrDefault();
            return uid;
        }

        return uid;
Hari Lakkakula
fuente
Por favor, no solo publique el código, especialmente sin ningún comentario. Si explica su código, sería más útil.
Ali Kanat
0

si alguien más tiene esta situación: estoy creando una verificación por correo electrónico para iniciar sesión en mi aplicación para que mis usuarios aún no hayan iniciado sesión, sin embargo, utilicé lo siguiente para verificar si hay un correo electrónico ingresado en el inicio de sesión, que es una variación de la solución @firecape

 ApplicationUser user = HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>().FindByEmail(Email.Text);

También necesitará lo siguiente:

using Microsoft.AspNet.Identity;

y

using Microsoft.AspNet.Identity.Owin;
Duan Walker
fuente
0

En .Net MVC5 core 2.2, uso HttpContext.User.Identity.Name. Funcionó para mi.

Bhupinder Yadav
fuente
0

Así es como obtuve un AspNetUser Id y lo mostré en mi página de inicio

Coloqué el siguiente código en mi método HomeController Index ()

ViewBag.userId = User.Identity.GetUserId();

En la página de vista solo llame

ViewBag.userId 

Ejecute el proyecto y podrá ver su ID de usuario

kelvin nyadzayo
fuente