Как получить текущего пользователя и как использовать класс 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 

Запустите проект, и вы сможете увидеть свой идентификатор пользователя