Как получить текущего пользователя и как использовать класс User в MVC5?
- Как я могу получить идентификатор текущего зарегистрированного пользователя в MVC 5? Я попробовал предложения StackOverflow, но они, похоже, не для MVC 5.
- Кроме того, что такое наилучшая практика MVC 5 по назначению пользователям данных? (например, a
User
должен иметь Items
. Должен ли я хранить пользователя Id
в Item
? Могу ли я расширить класс User
с помощью свойства навигации List<Item>
?
Я использую "Индивидуальные учетные записи пользователей" из шаблона MVC.
Пробовали эти:
'Членство .GetUser()' равно null.
Ответы
Ответ 1
Если вы кодируете в ASP.NET MVC Controller, используйте
using Microsoft.AspNet.Identity;
...
User.Identity.GetUserId();
Стоит отметить, что User.Identity.IsAuthenticated
и User.Identity.Name
будут работать без добавления вышеупомянутого оператора using
. Но GetUserId()
не будет присутствовать без него.
Если вы находитесь в классе, отличном от контроллера, используйте
HttpContext.Current.User.Identity.GetUserId();
В шаблоне MVC 5 по умолчанию идентификатор пользователя - это идентификатор GUID, который хранится в виде строки.
Пока нет лучшей практики, но нашел ценную информацию о расширении профиля пользователя:
Ответ 2
Попробуйте что-то вроде:
var store = new UserStore<ApplicationUser>(new ApplicationDbContext());
var userManager = new UserManager<ApplicationUser>(store);
ApplicationUser user = userManager.FindByNameAsync(User.Identity.Name).Result;
Работает с RTM.
Ответ 3
Если вы хотите, чтобы объект ApplicationUser в одной строке кода (если у вас установлена последняя идентификатор ASP.NET), попробуйте:
ApplicationUser user = System.Web.HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>().FindById(System.Web.HttpContext.Current.User.Identity.GetUserId());
Вам понадобятся следующие операторы:
using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.Owin;
Ответ 4
Получение идентификатора довольно прямолинейно, и вы решили это.
Второй вопрос, хотя и немного более сложный.
Итак, это все вещи, связанные с предварительным распространением прямо сейчас, но общая проблема, с которой вы сталкиваетесь, - это то, где вы распространяете пользователя с новыми свойствами (или коллекцией Items в вопросе).
Из коробки вы получите файл под названием IdentityModel
в папке "Модели" (на момент написания). Там у вас есть пара классов; ApplicationUser
и ApplicationDbContext
. Чтобы добавить свою коллекцию Items
, вы захотите изменить класс ApplicationUser
, как если бы это был обычный класс, который вы использовали с Entity Framework. На самом деле, если вы быстро посмотрите под капотом, вы обнаружите, что все классы, связанные с идентификацией (User, Role и т.д.), Теперь представляют собой только POCOs с соответствующими аннотациями данных, поэтому они отлично играют с EF6.
Затем вам нужно внести некоторые изменения в конструктор AccountController
, чтобы он знал, использовать ваш DbContext.
public AccountController()
{
IdentityManager = new AuthenticationIdentityManager(
new IdentityStore(new ApplicationDbContext()));
}
Теперь получение всего пользовательского объекта для вашего зарегистрированного пользователя является немного эзотерическим, если честно.
var userWithItems = (ApplicationUser)await IdentityManager.Store.Users
.FindAsync(User.Identity.GetUserId(), CancellationToken.None);
Эта строка выполнит задание, и вы сможете получить доступ к userWithItems.Items
, как хотите.
НТН
Ответ 5
Я чувствую твою боль, я пытаюсь сделать то же самое. В моем случае я просто хочу очистить пользователя.
Я создал класс базового контроллера, который наследует все мои контроллеры. В нем я переопределяю OnAuthentication
и устанавливаю filterContext.HttpContext.User to null
Это лучшее, что мне удалось сделать далеко...
public abstract class ApplicationController : Controller
{
...
protected override void OnAuthentication(AuthenticationContext filterContext)
{
base.OnAuthentication(filterContext);
if ( ... )
{
// You may find that modifying the
// filterContext.HttpContext.User
// here works as desired.
// In my case I just set it to null
filterContext.HttpContext.User = null;
}
}
...
}
Ответ 6
string userName="";
string userId = "";
int uid = 0;
if (HttpContext.Current != null && HttpContext.Current.User != null
&& HttpContext.Current.User.Identity.Name != null)
{
userName = HttpContext.Current.User.Identity.Name;
}
using (DevEntities context = new DevEntities())
{
uid = context.Users.Where(x => x.UserName == userName).Select(x=>x.Id).FirstOrDefault();
return uid;
}
return uid;
Ответ 7
если у кого-то еще есть такая ситуация: я создаю подтверждение по электронной почте, чтобы войти в мое приложение, чтобы мои пользователи еще не вошли в систему, однако я использовал нижеприведенное, чтобы проверить наличие электронного адреса, введенного при входе в систему, которое является вариантом решения @firecape
ApplicationUser user = HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>().FindByEmail(Email.Text);
Вам также понадобится следующее:
using Microsoft.AspNet.Identity;
а также
using Microsoft.AspNet.Identity.Owin;
Ответ 8
В .Net MVC5 core 2.2 я использую HttpContext.User.Identity.Name. Это сработало для меня.
Ответ 9
Вот как я получил идентификатор AspNetUser и отобразил его на своей домашней странице
Я поместил следующий код в метод HomeController Index()
ViewBag.userId = User.Identity.GetUserId();
На странице просмотра просто позвоните
ViewBag.userId
Запустите проект, и вы сможете увидеть свой идентификатор пользователя