No debería necesitar consultar la base de datos directamente para el usuario de la aplicación actual.
Eso introduce una nueva dependencia de tener un contexto adicional para empezar, pero en el futuro las tablas de la base de datos de usuarios cambian (3 veces en los últimos 2 años) pero la API es consistente. Por ejemplo, la users
tabla ahora se llama AspNetUsers
en Identity Framework, y los nombres de varios campos clave principales se mantuvieron cambiantes, por lo que el código en varias respuestas ya no funcionará tal cual .
Otro problema es que el acceso OWIN subyacente a la base de datos utilizará un contexto separado, por lo que los cambios del acceso SQL separado pueden producir resultados no válidos (por ejemplo, no ver los cambios realizados en la base de datos). Una vez más, la solución es el trabajo con el API proporcionado y no trata de trabajo en torno a ella.
La forma correcta de acceder al objeto de usuario actual en la identidad ASP.Net (a esta fecha) es:
var user = UserManager.FindById(User.Identity.GetUserId());
o, si tiene una acción asíncrona, algo como:
var user = await UserManager.FindByIdAsync(User.Identity.GetUserId());
FindById
requiere que tenga la siguiente instrucción de uso para que los UserManager
métodos no asíncronos estén disponibles (son métodos de extensión para UserManager, por lo que si no incluye esto, solo verá FindByIdAsync
):
using Microsoft.AspNet.Identity;
Si no está en un controlador en absoluto (por ejemplo, está usando la inyección de IOC), la identificación de usuario se recupera por completo de:
System.Web.HttpContext.Current.User.Identity.GetUserId();
Si no está en el controlador de cuenta estándar, deberá agregar lo siguiente (como ejemplo) a su controlador:
1. Agregue estas dos propiedades:
/// <summary>
/// Application DB context
/// </summary>
protected ApplicationDbContext ApplicationDbContext { get; set; }
/// <summary>
/// User manager - attached to application DB context
/// </summary>
protected UserManager<ApplicationUser> UserManager { get; set; }
2. Agregue esto en el constructor del controlador:
this.ApplicationDbContext = new ApplicationDbContext();
this.UserManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(this.ApplicationDbContext));
Actualización de marzo de 2015
Nota: La actualización más reciente del marco de Identity cambia una de las clases subyacentes utilizadas para la autenticación. Ahora puede acceder desde el Contexto Owin del Contenido Http actual.
ApplicationUser user = System.Web.HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>().FindById(System.Web.HttpContext.Current.User.Identity.GetUserId());
Apéndice:
Al usar EF e Identity Framework con Azure, a través de una conexión de base de datos remota (por ejemplo, pruebas de host local a la base de datos de Azure), puede golpear aleatoriamente el temido "error: 19 - La conexión física no es utilizable". Como la causa está oculta dentro de Identity Framework, donde no puede agregar reintentos (o lo que parece faltar .Include(x->someTable)
), debe implementar una costumbre SqlAzureExecutionStrategy
en su proyecto.
ApplicationUser
clase (específica de la aplicación) y laAspNetUsers
tabla en paralelo y proporcionarán cualquier campo nuevo. Nuevamente: ¡No golpee la base de datos directamente! :)Mi error, no debería haber usado un método dentro de una consulta LINQ.
Código correcto:
fuente
UserManager
métodos y no golpear la base de datos directamente?Está en los comentarios de las respuestas, pero nadie ha publicado esto como la solución real.
Solo necesita agregar una declaración de uso en la parte superior:
fuente
using
. Al ver que 15.000 personas visitaron la pregunta, pensé que era una respuesta útil :).GetUserId()
es un método de extensión¡El código de Ellbar funciona! Solo necesitas agregar usando.
1 -
using Microsoft.AspNet.Identity;
Y ... el código de Ellbar:
2 -
string currentUserId = User.Identity.GetUserId(); ApplicationUser currentUser = db.Users.FirstOrDefault(x => x.Id == currentUserId);
Con este código (en
currentUser
), trabaja los datos generales del usuario conectado, si desea datos adicionales ... vea este enlacefuente
ApplicationUser
objetoA partir de ASP.NET Identity 3.0.0, esto se ha refactorizado en
fuente
fuente
Para MVC 5 solo mire dentro del método EnableTwoFactorAuthentication de ManageController en el andamio de plantillas de WebApplication, se está haciendo allí:
La respuesta está ahí, como lo sugiere el propio Microsoft:
Tendrá todas las propiedades adicionales que definió en la clase ApplicationUser.
fuente
En este momento, la plantilla de proyecto asp.mvc crea un controlador de cuenta que obtiene el administrador de usuario de esta manera:
Lo siguiente funciona para mí:
fuente
Estaba disponible con éxito para obtener el Usuario de la aplicación siguiendo un fragmento de código
fuente
En caso de que alguien esté trabajando con
Identity
usuariosweb forms
, lo hice funcionar al hacerlo:fuente