Вам не нужно запрашивать базу данных напрямую для текущего 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
в свой проект.
ApplicationUser
класс (приложение) иAspNetUsers
таблицу параллельно, и они предоставят любые новые поля. Опять же: не попадайте в базу данных напрямую! :)Моя ошибка, я не должен был использовать метод внутри запроса LINQ.
Правильный код:
источник
UserManager
методы, а не попадать в базу данных напрямую?Это в комментариях ответов, но никто не опубликовал это как фактическое решение.
Вам просто нужно добавить оператор использования вверху:
источник
using
. Поскольку 15k человек посетили вопрос, я понял, что это был полезный ответ :).GetUserId()
это метод расширенияКод Ellbar работает! Вам нужно только добавить использование.
1 -
using Microsoft.AspNet.Identity;
И ... код Ellbar:
2 -
string currentUserId = User.Identity.GetUserId(); ApplicationUser currentUser = db.Users.FirstOrDefault(x => x.Id == currentUserId);
С этим кодом (in
currentUser
) вы работаете с общими данными подключенного пользователя, если вам нужны дополнительные данные ... см. Эту ссылкуисточник
ApplicationUser
Начиная с ASP.NET Identity 3.0.0, это было переработано в
источник
источник
Для MVC 5 просто загляните внутрь метода EnableTwoFactorAuthentication ManageController в скаффолде шаблона WebApplication, это делается там:
Ответ прямо здесь, как предложено самой Microsoft:
Он будет иметь все дополнительные свойства, которые вы определили в классе ApplicationUser.
источник
Прямо сейчас шаблон проекта asp.mvc создает контроллер аккаунта, который получает usermanager следующим образом:
Следующие работы для меня:
источник
Я был успешно доступен, чтобы получить пользователя приложения по следующему коду
источник
В случае, если кто-то работает с
Identity
пользователямиweb forms
, я получил это, сделав так:источник