ASP.NET MVC 5-идентичность. Как получить текущий ApplicationUser
у меня есть статья сущности в моем проекте, которые ApplicationUser
свойство с именем Author
. Как я могу получить полный объект текущего журнала ApplicationUser
. При создании новой статьи я должен установить Author
в собственность Article
в течение ApplicationUser
.
в старом механизме членства это было просто, но в новом подходе идентичности я не знаю, как это сделать.
Я пытался сделать это таким образом:
- добавить оператор using для расширения личности :
using Microsoft.AspNet.Identity;
- затем я пытаюсь получить текущего пользователя:
ApplicationUser currentUser = db.Users.FirstOrDefault(x => x.Id == User.Identity.GetUserId());
но я получаю исключение :
LINQ to Entities не распознает систему метода.Строка GetUserId(System.Безопасность.Главный.Способ IIdentity), и этот метод не может быть переведен в магазине выражение.
Source=EntityFramework
10 ответов:
вам не нужно запрашивать базу данных непосредственно для текущего пользователя 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 framework изменяет один из базовых классов, используемых для проверки подлинности. вы теперь можно получить доступ к нему из контекста 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
в вашем проекте.
моя ошибка, Я не должен был использовать метод внутри запросов LINQ.
правильный код:
string currentUserId = User.Identity.GetUserId(); ApplicationUser currentUser = db.Users.FirstOrDefault(x => x.Id == currentUserId);
его в комментариях ответов, но никто не опубликовал это как фактическое решение.
вам просто нужно добавить оператор using вверху:
using Microsoft.AspNet.Identity;
код Ellbar работает! Вам нужно только добавить использование.
1 -
using Microsoft.AspNet.Identity;
и... код Эллбара:
2 -
string currentUserId = User.Identity.GetUserId(); ApplicationUser currentUser = db.Users.FirstOrDefault(x => x.Id == currentUserId);
С этим кодом (в
currentUser
), вы работаете с общими данными подключенного пользователя, если вам нужны дополнительные данные... смотрите этой ссылке
по состоянию на ASP.NET Identity 3.0.0, это было преобразовано в
//returns the userid claim value if present, otherwise returns null User.GetUserId();
ApplicationDbContext context = new ApplicationDbContext(); var UserManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(context)); ApplicationUser currentUser = UserManager.FindById(User.Identity.GetUserId()); string ID = currentUser.Id; string Email = currentUser.Email; string Username = currentUser.UserName;
прямо сейчас жерех.шаблон проекта mvc создает контроллер учетной записи, который получает usermanager следующим образом:
HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>()
следующие работы для меня:
ApplicationUser user = HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>().FindById(User.Identity.GetUserId());
для MVC 5 просто загляните внутрь метода EnableTwoFactorAuthentication ManageController в шаблоне веб-приложения scaffold, его выполнение там:
[HttpPost] [ValidateAntiForgeryToken] public async Task<ActionResult> EnableTwoFactorAuthentication() { await UserManager.SetTwoFactorEnabledAsync(User.Identity.GetUserId(), true); var user = await UserManager.FindByIdAsync(User.Identity.GetUserId()); if (user != null) { await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false); } return RedirectToAction("Index", "Manage"); }
ответ прямо там, как предложил сам Microsoft:
var user = await UserManager.FindByIdAsync(User.Identity.GetUserId());
Он будет иметь все дополнительные свойства, определенные в классе ApplicationUser.
Я был успешно доступен, чтобы получить пользователя приложения, следуя кусок кода
var manager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext())); var user = manager.FindById(User.Identity.GetUserId()); ApplicationUser EmpUser = user;
В случае, если кто-то работает с
Identity
пользователиweb forms
, Я получил это работает, делая так:var manager = Context.GetOwinContext().GetUserManager<ApplicationUserManager>(); var user = manager.FindById(User.Identity.GetUserId());
Comments