tutorial net mvc español dropdownlist asp asp.net-mvc-5 claims-based-identity asp.net-identity-2

asp.net-mvc-5 - dropdownlist - asp.net mvc 5 tutorial español



¿Cómo puedo obtener Identity UserID en el controlador justo después de un inicio de sesión exitoso? (4)

Estoy usando Identity v2 y MVC 5 para inicio de sesión externo.

En mi función de devolución de llamada de inicio de sesión externa, inicio la sesión del usuario con

var result = await SignInManager.ExternalSignInAsync(loginInfo, isPersistent: false);

luego hay un cambio para el result , y necesito acceder a la ID del usuario en el caso de success , pero User.Identity.GetUserId(); me da nula aqui

¿Cómo puedo acceder a la identificación del usuario en este caso?


OK, encontré un camino; Puedo conseguirlo a través de:

var userID = UserManager.FindByEmail(loginInfo.Email).Id;

Pero, no creo que esta sea la mejor solución ya que parece que llegué a la base de datos con dos consultas. ¿Alguien puede ofrecer una mejor solución?


Para obtener datos de reclamaciones y otra información sobre la identidad de inicio de sesión inmediatamente después de un inicio de sesión exitoso, sin ir a la base de datos, simplemente acceda a signinManager.AuthenticationManager.AuthenticationResponseGrant.Identity .

Por ejemplo,

switch (result) { case SignInStatus.Success: var userId = signinManager.AuthenticationManager.AuthenticationResponseGrant .Identity.GetUserId(); // ...

También puede ver que se usa en la respuesta de esta otra pregunta para agregar nuevos reclamos a una identidad inmediatamente después del inicio de sesión: AuthenticationManager.AuthenticationResponseGrant.Identity.AddClaims(freshClaims);


Puede utilizar el código de abajo.

Agregue una función a la clase ApplicationSignInManager en Identity.Config.cs

public override Task SignInAsync(ApplicationUser user, bool isPersistent, bool rememberBrowser) { var claims = new List<Claim>() { new Claim(ClaimTypes.NameIdentifier, user.Id), new Claim(ClaimTypes.Email, user.Email) }; this.AuthenticationManager.User.AddIdentity(new ClaimsIdentity(claims)); return base.SignInAsync(user, isPersistent, rememberBrowser); }

Prueba el codigo

private ClaimsPrincipal GetCurrentUser() { var context = HttpContext.GetOwinContext(); if (context == null) return null; if (context.Authentication == null || context.Authentication.User == null) return null; return context.Authentication.User; } private string GetUserId() { var user = GetCurrentUser(); if (user == null) return null; var claim = user.Claims.FirstOrDefault(o => o.Type == ClaimTypes.NameIdentifier); if (claim == null) return null; return claim.Value; } private string GetUserEmail() { var user = GetCurrentUser(); if (user == null) return null; var claim = user.Claims.FirstOrDefault(o => o.Type == ClaimTypes.Email); if (claim == null) return null; return claim.Value; }


Utilizo el objeto System.Security.Claims.ClaimTypes.NameIdentifier para mantener mi ID de usuario

Y creé una clase de ayuda para alcanzar los valores en ella.

public class UserHelper { public static string GetUserId() { var identity = (System.Security.Claims.ClaimsPrincipal)System.Threading.Thread.CurrentPrincipal; var principal = System.Threading.Thread.CurrentPrincipal as System.Security.Claims.ClaimsPrincipal; var userId = identity.Claims.Where(c => c.Type == System.Security.Claims.ClaimTypes.NameIdentifier).Select(c => c.Value).SingleOrDefault(); return userId; } public static string GetUserName() { var identity = (System.Security.Claims.ClaimsPrincipal)System.Threading.Thread.CurrentPrincipal; var principal = System.Threading.Thread.CurrentPrincipal as System.Security.Claims.ClaimsPrincipal; var name = identity.Claims.Where(c => c.Type == System.Security.Claims.ClaimTypes.Name).Select(c => c.Value).SingleOrDefault(); return name; } public static string GetUserMail() { var identity = (System.Security.Claims.ClaimsPrincipal)System.Threading.Thread.CurrentPrincipal; var principal = System.Threading.Thread.CurrentPrincipal as System.Security.Claims.ClaimsPrincipal; var mail = identity.Claims.Where(c => c.Type == System.Security.Claims.ClaimTypes.Email).Select(c => c.Value).SingleOrDefault(); return mail; } }

y lo llamo con

var user = UserHelper.GetUserId();