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


522   10  

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

    Ничего не найдено.