Як отримати поточного користувача та як користуватися класом 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. Безпека?
Арон

"Облікові записи індивідуальних користувачів" з шаблону MVC.
Адам Сабо

3
HttpContext.Current.User.Identity.Name- ім’я користувача, який зараз зареєстрований.
Wiktor Zychla

1
Як отримати ідентифікатор ? Я хотів би призначити поточного користувача для створеного Itemним, але не виходячи з імені користувача (що може змінитися). Це не працює тим, що `HttpContext.Current 'System.Web.HttpContextBase' не містить визначення для 'Current' і не може бути знайдено метод розширення 'Current', що приймає перший аргумент типу 'System.Web.HttpContextBase' ( Ви пропускаєте директиву використання або посилання на збірку?) `. Ви впевнені, що ваше рішення призначене для MVC 5?
Адам Сабо

Відповіді:


313

Якщо ви кодуєте в контролері ASP.NET MVC, використовуйте

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
огляд.UserId = Guid.Parse (User.Identity.GetUserId ());
NicoJuicy

Якщо я додаю довідковий користувач Користувач все ще підкреслений червоним? Чому це було б?
Zapnologica

@Zapnologica: спробуйте відновити проект, можливо VS IntelliSense трохи повільніше.
Адам Сабо

5
ПРИМІТКА Користувач доступний лише у контролері msdn.microsoft.com/en-us/library/… (@Zapnologica ви використовуєте його поза контролером? Спробуйте HttpContext.Current.User.Identity.GetUserId ();)
між

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
@Arash, як програма повинна отримати об’єкт користувача, не звертаючись до бази даних?
fabspro

2
@Arash неважливо, я бачу, що ти маєш на увазі. Ідентифікатор можна отримати за допомогою User.Identity.GetUserId (); без жодної поїздки в базу даних.
fabspro

Пам'ятайте з mvc5 (членство 2): User.Identity.GetUserId () відрізняється від ідентифікатора в таблиці [AspNetUsers]. Тож Якуб Арнольд і Рок - правильний шлях
Сірий Вовк

Я трохи плутаю відповідь. Я отримую, що тип UserStore, схоже, не існує в моєму контексті контролера. Будь-які ідеї?
Jhourlad Estrella

19

Якщо ви хочете, щоб об'єкт 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;

Об'єкт не знайдено для <ApplicationUserManager>
Fandango68,

7

Отримати Id досить прямо, і ви це вирішили.

Твоє друге питання хоч трохи більше.

Отже, це все матеріали, що попередньо випускають зараз, але загальна проблема, з якою ви стикаєтеся, полягає в тому, що ви розширюєте користувача новими властивостями (або колекцію елементів у вас виникає питання).

З вікна ви отримаєте файл, який називається IdentityModelв папці Моделі (під час написання). Там у вас є пара занять; 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як хочете.

HTH


Я не думаю, що для цього все є щось на кшталт документів до випуску?
Дерек Томес

@Derek Tomes - Не те, що я натрапив. Я вважаю, що нам доведеться чекати до 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

Ось так я отримав ідентифікатор AspNetUser і відобразив його на своїй домашній сторінці

Я розмістив такий код у своєму методі HomeController Index ()

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

На сторінці перегляду просто зателефонуйте

ViewBag.userId 

Запустіть проект, і ви зможете побачити свій userId

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.