Вам не нужно запрашивать базу данных напрямую для текущего 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
требует наличия следующего оператора using, чтобы не асинхронные 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. Добавьте это в конструктор контроллера:
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
в свой проект.