Как я могу получить идентификатор 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;

Но я не думаю, что это лучшее решение, так как кажется, что я попал в БД двумя запросами. Может ли кто-нибудь предложить лучшее решение?