c# - management - ¿Cómo obtener el usuario actual y cómo usar User class en MVC5?
mvc 5 identity user management (5)
- ¿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 tenerItems
. ¿Debo guardar elId
del usuario en elItem
? ¿Puedo extender la clase deUser
con una propiedad de navegación deList<Item>
?
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.
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
Pruebe 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.
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<ApplicationUserManager>().FindById(System.Web.HttpContext.Current.User.Identity.GetUserId());
Necesitará las siguientes instrucciones de uso:
using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.Owin;
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 declaración 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:
- Descripción general de la
Identity
: http://blogs.msdn.com/b/webdev/archive/2013/06/27/introducing-asp-net-identity-membership-system-for-asp-net-applications.aspx - Solución de ejemplo sobre cómo extender el perfil de usuario agregando una propiedad adicional: https://github.com/rustd/AspnetIdentitySample
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;
}
}
...
}