Вам не потрібно буде запитувати базу даних безпосередньо для поточного ApplicationUser.
Це вводить нову залежність від додаткового контексту для початківців, але при зміні таблиць баз даних користувачів (3 рази за останні 2 роки), але API є послідовним. Наприклад, users
таблиця тепер називається AspNetUsers
в Identity Framework, і назви декількох полів первинного ключа постійно змінюються, тому код у кількох відповідях більше не працюватиме як є .
Інша проблема полягає в тому, що базовий доступ OWIN до бази даних використовуватиме окремий контекст, тому зміни від окремого доступу до SQL можуть давати недійсні результати (наприклад, не бачити змін, внесених до бази даних). Знову ж таки рішення - працювати з доданим API, а не намагатися обійти його.
Правильний спосіб отримати доступ до поточного об’єкта користувача в ідентичності ASP.Net (на дату):
var user = UserManager.FindById(User.Identity.GetUserId());
або, якщо у вас є дія асинхронізації, щось на кшталт:
var user = await UserManager.FindByIdAsync(User.Identity.GetUserId());
FindById
вимагає, щоб у вас є наступне використання оператора, щоб доступні не-асинхронні UserManager
методи (це методи розширення для UserManager, тому якщо ви не включите це, ви побачите лише FindByIdAsync
):
using Microsoft.AspNet.Identity;
Якщо ви зовсім не в контролері (наприклад, використовуєте ін'єкцію IOC), ідентифікатор користувача буде отриманий повністю з:
System.Web.HttpContext.Current.User.Identity.GetUserId();
Якщо ви не в стандартному контролері облікового запису, вам потрібно буде додати наступне (як приклад) до свого контролера:
1. Додайте ці два властивості:
/// <summary>
/// Application DB context
/// </summary>
protected ApplicationDbContext ApplicationDbContext { get; set; }
/// <summary>
/// User manager - attached to application DB context
/// </summary>
protected UserManager<ApplicationUser> UserManager { get; set; }
2. Додайте це в конструктор Controller:
this.ApplicationDbContext = new ApplicationDbContext();
this.UserManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(this.ApplicationDbContext));
Оновлення березня 2015 року
Примітка . Останнє оновлення фреймворку Identity змінює один з базових класів, що використовується для аутентифікації. Тепер ви можете отримати доступ до нього з контексту Owin поточного HttpContent.
ApplicationUser user = System.Web.HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>().FindById(System.Web.HttpContext.Current.User.Identity.GetUserId());
Додаток:
Використовуючи EF та Identity Framework з Azure, через віддалене підключення до бази даних (наприклад, локальне тестування хоста до бази даних Azure), ви можете випадковим чином потрапити на жахливу "помилку: 19 - фізичне з'єднання не придатне для використання". Оскільки причина похована в рамці Identity Framework, де ви не можете додати повторні спроби (або те, що, здається, відсутнє .Include(x->someTable)
), вам потрібно впровадити спеціальний SqlAzureExecutionStrategy
проект у свій проект.