2014-12-29 7 views
13

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

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

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

+0

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

ответ

21

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

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

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

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

Хорошо - ближе. У меня есть ссылка менеджера пользователя.Сейчас я получаю сообщение об ошибке в интегрированной среде что-то говорил о AWAIT нуждающейся метод асинхронной и т.д. –

+1

Вы можете просто позвонить синхронную метод следующим образом 'уаг пользователя = UserManager.FindByName (имя пользователя),' Кроме того, вы может сделать действие вашего контроллера методом Async, используя следующую конвецию. 'public async Task YourControllerAction (...)' Обратите внимание на использование async. –

+0

Не-асинк работал! –

1

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

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

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

EDIT

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

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; } 
+0

Как вы получаете контекст «пользовательского менеджера»? –

+0

См. Редактирование в моем сообщении. При использовании шаблона Visual Studio вы должны найти декларацию внутри вашего ** AccountController **. –

3

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

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

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

В другом контроллере s (и, возможно, выбрать другие места, где HttpContext доступна) создается диспетчер пользователей с:

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

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

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

Это более точный ответ. –

0

При использовании подшипника токен аутентификации, приведенном выше примере, не возвращают пользовательское приложение ,

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

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

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

Смежные вопросы