Как получить текущего пользователя и как использовать класс User в MVC5?

159
  • Как я могу получить идентификатор текущего пользователя, вошедшего в систему в MVC 5 ? Я попробовал предложения StackOverflow, но они, похоже, не для MVC 5.
  • Кроме того, какова наилучшая практика MVC 5 при назначении материала пользователям? (например, Userдолжен иметь Items. Должен ли я хранить пользовательские Idв Item? Могу ли я расширить Userкласс с помощью List<Item>свойства навигации?

Я использую "Индивидуальные учетные записи пользователей" из шаблона MVC.

Пробовал эти:

'Membership.GetUser ()' является нулевым.

Адам Сзабо
источник
Добавлены ссылки на то, что я пробовал. Последний был в норме в MVC4, но не в MVC5. Также мне нужна лучшая практика "использования пользователя" :)
Адам Сабо
Когда вы говорите, что используете MVC 5, что вы используете для членства? OWin.Security?
Арон
«Индивидуальные учетные записи пользователей» из шаблона MVC.
Адам Сзабо
3
HttpContext.Current.User.Identity.NameИмя зарегистрированного пользователя.
Виктор Зихла
1
Как получить идентификатор ? Я хотел бы назначить текущего пользователя для Itemон создает, но не на основе имени пользователя (это может измениться). Это не работает из-за того, что `HttpContext.Current 'System.Web.HttpContextBase' не содержит определения для 'Current', и нет никакого метода расширения 'Current', принимающего первый аргумент типа 'System.Web.HttpContextBase' ( вам не хватает директивы using или ссылки на сборку?) `. Вы уверены, что ваше решение для MVC 5?
Адам Сабо

Ответы:

313

Если вы пишете в 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, хранящийся в виде строки.

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

Адам Сзабо
источник
9
Аутентификация и авторизация пользователей изменились для ASP.NET MVC 5. Теперь это аутентификация на основе утверждений с интерфейсами и универсальными репозиториями, которые вы можете использовать с EF или другим провайдером (реализация EF поставляется по умолчанию). Поскольку GetUserIdэто метод расширения, который хранится в нижней части Ass_Start\IdentityConfig.cs, где бы вам ни понадобилось его использовать, если он находится в другом пространстве имен, вам нужно установить, using Microsoft.AspNet.Identityчтобы расширение стало видимым.
Андерсон Матос
1
survey.UserId = Guid.Parse (User.Identity.GetUserId ());
NicoJuicy
Если я добавлю ссылку на использование, пользователь все еще подчеркнут красным? С чего бы это?
Zapnologica
@Zapnologica: попробуйте перестроить проект, возможно VS IntelliSense немного медленный.
Адам Сзабо
5
Примечание пользователя доступна только в контроллере msdn.microsoft.com/en-us/library/... (@Zapnologica вы используете его вне контроллера попробовать HttpContext.Current.User.Identity.GetUserId (?);)
Adween
28

Попробуйте что-то вроде:

var store = new UserStore<ApplicationUser>(new ApplicationDbContext());
var userManager = new UserManager<ApplicationUser>(store);
ApplicationUser user = userManager.FindByNameAsync(User.Identity.Name).Result;

Работает с RTM.

Рок Бермеж
источник
11
Это накладывает ненужное отключение базы данных.
Араш
3
@ Араш, как приложение должно получить объект пользователя, не связываясь с базой данных?
Fabspro
2
@ Араш, неважно, я понимаю, что ты имеешь в виду. Идентификатор можно получить с помощью User.Identity.GetUserId (); без какой-либо поездки базы данных.
Fabspro
Помните, что с mvc5 (членство 2): User.Identity.GetUserId () отличается от идентификатора в таблице [AspNetUsers]. Так что Якуб Арнольд и Рок - правильный путь
Серый Волк,
Я немного запутался с ответом. Я получаю, что тип UserStore не существует в контексте моего контроллера. Любые идеи?
Jhourlad Estrella
19

Если вы хотите, чтобы объект ApplicationUser был в одной строке кода (если у вас установлена ​​последняя версия ASP.NET Identity), попробуйте:

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;
firecape
источник
Объект не найден для <ApplicationUserManager>
Fandango68
7

Получение идентификатора довольно просто, и вы решили это.

Ваш второй вопрос, хотя и немного сложнее.

Итак, все это предварительные выпуски прямо сейчас, но общая проблема, с которой вы сталкиваетесь, это когда вы расширяете пользователя новыми свойствами (или коллекцией Предметов в вашем вопросе).

Из коробки вы получите файл, который называется IdentityModelв папке Models (на момент написания). Там у вас есть пара классов; ApplicationUserи ApplicationDbContext. Чтобы добавить свою коллекцию, Itemsвы захотите изменить ApplicationUserкласс, как если бы это был обычный класс, который вы использовали с Entity Framework. Фактически, если вы быстро загляните внутрь, вы обнаружите, что все классы, связанные с идентификацией (Пользователь, Роль и т. Д.), Теперь просто POCO с соответствующими аннотациями данных, поэтому они отлично работают с 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как вы хотите.

НТН

EightyOne Unite
источник
Я не думаю, что есть что-то вроде предварительной документации для всего этого есть?
Дерек Томес
@ Дерек Томес - Не то чтобы я сталкивался. Я считаю, что нам придется ждать до 13 ноября реальных документов. Честно говоря, это не так здорово, есть даже просьба о более точном руководстве в голосе пользователя - aspnet.uservoice.com/forums/41199-general-asp-net/suggestions/…
EightyOne Unite
хорошо, но как мне добраться до экземпляра типа AccountController?
гнездо
0

Я чувствую твою боль, я пытаюсь сделать то же самое. В моем случае я просто хочу очистить пользователя.

Я создал базовый класс контроллеров, от которого наследуются все мои контроллеры. В нем я переопределяю 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;
        }
    }
    ...
}
Дерек Томес
источник
0
        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;
Хари Лаккакула
источник
Пожалуйста, не просто размещайте код, особенно без комментариев. Если вы объясните свой код, это будет более полезно.
Али Канат
0

если у кого-то еще есть такая ситуация: я создаю подтверждение по электронной почте, чтобы войти в мое приложение, чтобы мои пользователи еще не вошли в систему, однако я использовал нижеприведенное, чтобы проверить наличие электронного адреса, введенного при входе в систему, которое является вариантом решения @firecape

 ApplicationUser user = HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>().FindByEmail(Email.Text);

Вам также понадобится следующее:

using Microsoft.AspNet.Identity;

и

using Microsoft.AspNet.Identity.Owin;
Дуан Уокер
источник
0

В .Net MVC5 core 2.2 я использую HttpContext.User.Identity.Name. Это сработало для меня.

Бхупиндер Ядав
источник
0

Вот как я получил AspNetUser Id и отобразил его на своей домашней странице

Я поместил следующий код в метод HomeController Index ()

ViewBag.userId = User.Identity.GetUserId();

На странице просмотра просто позвоните

ViewBag.userId 

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

Кельвин Нядзайо
источник