¿Cómo obtener el usuario actual y cómo usar User class en MVC5?

  • ¿Cómo puedo obtener la identificación del usuario actualmente conectado en MVC 5 ? Intenté las sugerencias de StackOverflow, pero parece que no son para MVC 5.
  • Además, ¿cuál es la mejor práctica de MVC 5 de asignar cosas a los usuarios? (Por ejemplo, un User debería tener Items . ¿Debo guardar el Id del usuario en el Item ? ¿Puedo extender la clase de User con una propiedad de navegación de List ?

Estoy usando “Cuentas de usuario individuales” de la plantilla de MVC.

Intenté estos:

  • ¿Cómo obtengo el usuario actual en una aplicación MVC?
  • Cómo obtener el usuario actual en ASP.NET MVC
  • Acceda al ID del usuario : esto arroja lo siguiente:

‘Membership.GetUser ()’ es nulo.

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.Name funcionarán sin agregar la statement de using mencionada anteriormente. Pero GetUserId() no estará presente sin él.

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

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

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

Todavía no se cuenta con la mejor práctica, pero se encontró información valiosa sobre la extensión del perfil del usuario:

Pruebe algo como:

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

Funciona con RTM.

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

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

Necesitará las siguientes instrucciones de uso:

 using Microsoft.AspNet.Identity; using Microsoft.AspNet.Identity.Owin; 

Obtener el Id es bastante directo y lo has resuelto.

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

Por lo tanto, esto es todo lo que se puede presentar en este momento, pero el problema común al que se enfrenta es cuando se le extiende al usuario nuevas propiedades (o una colección de elementos en su pregunta).

De fábrica, obtendrá un archivo llamado IdentityModel en la carpeta Modelos (en el momento de escribir). Ahí tienes un par de clases; ApplicationUser y ApplicationDbContext . Para agregar su colección de Items , querrá modificar la clase ApplicationUser , tal como lo haría si esta fuera una clase normal que estuviera usando con Entity Framework. De hecho, si echas un vistazo rápido debajo del capó encontrarás que todas las clases relacionadas con la identidad (Usuario, Rol, etc. …) son solo POCOs ahora con las anotaciones de datos apropiadas para que jueguen bien con EF6.

A continuación, deberá realizar algunos cambios en el constructor AccountController para que sepa cómo usar su DbContext.

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

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

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

Esa línea hará el trabajo y podrá acceder a userWithItems.Items como desee.

HTH

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

Creé una clase de controlador base del que todos mis controladores heredan. En él OnAuthentication y establezco OnAuthentication filterContext.HttpContext.User to null

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; } } ... }