Как я могу получить идентификатор UserID в контроллере сразу после успешного результата входа?
Я использую Identity v2 и MVC 5 для внешнего входа.
В моей внешней функции обратного вызова входа я регистрирую пользователя с помощью
var result = await SignInManager.ExternalSignInAsync(loginInfo, isPersistent: false);
тогда есть переключатель для result
, и мне нужно получить доступ к идентификатору пользователя в случае success
, но User.Identity.GetUserId();
дает мне null здесь.
Как я могу получить доступ к идентификатору пользователя в этом случае?
Ответы
Ответ 1
Чтобы получить данные о претензиях и другую информацию о подписанной идентификационной информации сразу после успешного входа в систему, не обращаясь к базе данных, просто войдите в signinManager.AuthenticationManager.AuthenticationResponseGrant.Identity
.
Например,
switch (result)
{
case SignInStatus.Success:
var userId = signinManager.AuthenticationManager.AuthenticationResponseGrant
.Identity.GetUserId();
// ...
Вы также можете увидеть, что он используется в этом другом вопросе, чтобы добавить новые претензии к личности сразу после входа в систему - AuthenticationManager.AuthenticationResponseGrant.Identity.AddClaims(freshClaims);
Ответ 2
вы можете использовать код ниже.
Добавить функцию в класс ApplicationSignInManager в 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);
}
Попробуйте код
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;
}
Ответ 3
Я использую объект System.Security.Claims.ClaimTypes.NameIdentifier
для сохранения идентификатора пользователя
И я создал вспомогательный класс для достижения значений в нем
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;
}
}
и я называю это
var user = UserHelper.GetUserId();
Ответ 4
ОК, я нашел один; Я могу получить его через:
var userID = UserManager.FindByEmail(loginInfo.Email).Id;
Но я не думаю, что это лучшее решение, так как кажется, что я попал в БД двумя запросами. Может ли кто-нибудь предложить лучшее решение?