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();