usar tutorial net mvc management framework español como asp c# asp.net-mvc-5 identity asp.net-identity

c# - tutorial - login identity asp net



ASP.NET MVC 5-Identidad. Cómo obtener ApplicationUser actual (10)

No debería necesitar consultar la base de datos directamente para el ApplicationUser actual.

Eso introduce una nueva dependencia de tener un contexto adicional para los principiantes, pero al avanzar 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 tabla de users ahora se llama AspNetUsers en Identity Framework, y los nombres de varios campos de clave principal AspNetUsers cambiando, por lo que el código en varias respuestas ya no funcionará como está .

Otro problema es que el acceso OWIN subyacente a la base de datos usará un contexto separado, por lo que los cambios de un 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 trabajar con la API suministrada y no intentar solucionarlo.

La forma correcta de acceder al objeto de usuario actual en la identidad de ASP.Net (en esta fecha) es:

var user = UserManager.FindById(User.Identity.GetUserId());

O, si tienes una acción asíncrona, algo como:

var user = await UserManager.FindByIdAsync(User.Identity.GetUserId());

FindById requiere que tenga la siguiente declaración de uso para que estén disponibles los métodos no asíncronos de UserManager (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 (por ejemplo, está utilizando 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 marzo 2015

Nota: la actualización más reciente de Identity framework cambia una de las clases subyacentes utilizadas para la autenticación. Ahora puede acceder a él desde el contexto de Owin del contenido actual de HttpContent.

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

Apéndice:

Al utilizar 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 ser un .Include(x->someTable) ), debe implementar una SqlAzureExecutionStrategy personalizada en su proyecto.

Tengo una entidad de artículo en mi proyecto que tiene la propiedad ApplicationUser llamada Author . ¿Cómo puedo obtener el objeto completo del ApplicationUser registrado actualmente? Al crear un nuevo artículo, tengo que establecer la propiedad Author en Article en el ApplicationUser actual.

En el antiguo mecanismo de Membresía era simple, pero en el nuevo enfoque de Identidad no sé cómo hacerlo.

Traté de hacerlo de esta manera:

  • Agregue el uso de la declaración para las extensiones de identidad: using Microsoft.AspNet.Identity;
  • Luego trato de obtener el usuario actual: ApplicationUser currentUser = db.Users.FirstOrDefault(x => x.Id == User.Identity.GetUserId());

Pero me sale la siguiente excepción:

LINQ to Entities no reconoce el método ''System.String GetUserId (System.Security.Principal.IIdentity)'', y este método no se puede traducir a una expresión de tienda. Fuente = EntityFramework


¡El código de Ellbar funciona! Sólo necesitas añadir 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); string currentUserId = User.Identity.GetUserId(); ApplicationUser currentUser = db.Users.FirstOrDefault(x => x.Id == currentUserId);

Con este código (en currentUser ), usted trabaja los datos generales del usuario conectado, si desea datos adicionales ... vea este enlace


A partir de ASP.NET Identity 3.0.0, esto se ha refactorizado en

//returns the userid claim value if present, otherwise returns null User.GetUserId();


En caso de que alguien esté trabajando con usuarios de Identity en web forms , lo hice trabajando al hacerlo:

var manager = Context.GetOwinContext().GetUserManager<ApplicationUserManager>(); var user = manager.FindById(User.Identity.GetUserId());


En este momento, la plantilla de proyecto asp.mvc crea un controlador de cuenta que obtiene el administrador de usuarios de esta manera:

HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>()

Los siguientes trabajos para mí:

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


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:

using Microsoft.AspNet.Identity;


Estuve disponible con éxito para obtener el usuario de la aplicación por el siguiente fragmento de código

var manager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext())); var user = manager.FindById(User.Identity.GetUserId()); ApplicationUser EmpUser = user;


Mi error, no debería haber usado un método dentro de una consulta LINQ.

Código correcto:

string currentUserId = User.Identity.GetUserId(); ApplicationUser currentUser = db.Users.FirstOrDefault(x => x.Id == currentUserId);


Para MVC 5, simplemente mire dentro del método EnableTwoFactorAuthentication de ManageController en el andamio de la plantilla WebApplication, se realiza allí:

[HttpPost] [ValidateAntiForgeryToken] public async Task<ActionResult> EnableTwoFactorAuthentication() { await UserManager.SetTwoFactorEnabledAsync(User.Identity.GetUserId(), true); var user = await UserManager.FindByIdAsync(User.Identity.GetUserId()); if (user != null) { await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false); } return RedirectToAction("Index", "Manage"); }

La respuesta está ahí, como lo sugiere el propio Microsoft:

var user = await UserManager.FindByIdAsync(User.Identity.GetUserId());

Tendrá todas las propiedades adicionales que definió en la clase ApplicationUser.


ApplicationDbContext context = new ApplicationDbContext(); var UserManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(context)); ApplicationUser currentUser = UserManager.FindById(User.Identity.GetUserId()); string ID = currentUser.Id; string Email = currentUser.Email; string Username = currentUser.UserName;