Получить идентификатор пользователя с идентификатором имени пользователя 2.0

MVC 5 с идентификатором asp.net 2.0

Я понимаю, как получить текущий идентификатор пользователя. Мне нужно получить идентификатор пользователя другого пользователя в системе. Как это делается?

Ex. Мне нужно получить идентификатор пользователя из имен пользователей "fsmith"...

Ответы

Ответ 1

Внутри AccountController вы можете вызвать следующий метод, чтобы получить объект пользователя, а затем получить идентификатор пользователя.

var user = await UserManager.FindByNameAsync(userName);
var userId = user.Id;

Если вы не находитесь в AccountController, вы можете получить ссылку UserManager, используя следующий код

var UserManager = HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();

Ответ 2

Добавить в Шаши полезный ответ...

Если вы находитесь внутри контроллера учетной записи, вы можете использовать существующий UserManager:

var user = await UserManager.FindByNameAsync(userName);
var userId = user.Id;

В других контроллерах (и, возможно, выберите другие места, где доступен HttpContext), вы создаете User Manager с:

var um = HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();

Но мне потребовалось некоторое время, чтобы понять, что вы можете получить его почти где угодно с этим последним бит. Например, я использовал его в методе seed (в Configuration.cs), чтобы я мог засеять свойство User другой модели:

var um = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(*insert-your-db-context-here*));

Ответ 3

Один из способов - использовать метод FindByNameAsync вашего пользовательского менеджера (или его общую версию). Он принимает имя пользователя (в вашем случае "fsmith") и возвращает задачу пользовательского объекта. Этот пользовательский объект содержит всю информацию об этом пользователе.

Фрагмент кода может выглядеть примерно так: (если вы ищете идентификатор базы данных):

var user = await UserManager.FindByNameAsync("fsmith");
var userId = user.Id;

РЕДАКТИРОВАТЬ

Экземпляр UserManager обычно объявляется следующим образом (помните, что существует много способов его объявления, например, при использовании Dependency Injection):

public AccountController()
  : this(new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext())))
{
}

public AccountController(UserManager<ApplicationUser> userManager)
{
  UserManager = userManager;
}

public UserManager<ApplicationUser> UserManager { get; private set; }

Ответ 4

Если вы используете Bearen Token Auth, приведенный выше пример не возвращает пользователя приложения.

Вместо этого используйте это:

ClaimsPrincipal currentUser = this.User;
var currentUserName = currentUser.FindFirst(ClaimTypes.NameIdentifier).Value;
ApplicationUser user = await _userManager.FindByNameAsync(currentUserName);
return user.Id; 

Это работает в apsnetcore 2.0. Не пытались в более ранних версиях.