Как получить список пользователей из ASP.NET Identity?

Изменить: этот вопрос устарел

В тот момент, когда я спросил об этом, Identity Framework была движущейся целью. Авторы изменили довольно много вещей, и они разъединили несколько других, что упростило работу.

Взгляните на проект Asp.NET Identity Sample на github.


Я создаю небольшое приложение, которое требует управления пользователями. Регистрация не разрешена, вместо этого есть суперпользователь, который будет создавать и изменять данные для входа.

Я использую новый ASP.NET Identity системы членства, и, конечно же, создание пользователей и добавление ролей является простым и интуитивно понятным.

Теперь мой вопрос: как получить список пользователей с помощью класса AuthenticationIdentityManager, который используется сгенерированным классом AccountController? Я не мог найти способ получить доступ к списку пользователей с моего контроллера.

(Между прочим, новое название «Идентичность» может показаться кому-то потрясающим, но искать его - боль.)

Изменить: если я попытаюсь сделать это

ApplicationDbContext UsersContext = new ApplicationDbContext();
UsersContext.Users.ToList(); // Exception

Я получаю исключение Invalid column name 'Discriminator'. Определение ApplicationDbContext создается автоматически мастером нового приложения:

using Microsoft.AspNet.Identity.EntityFramework;

namespace Cobranzas.Models
{
    public class ApplicationUser : User
    {

    }
    public class ApplicationDbContext : IdentityDbContextWithCustomUser<ApplicationUser>
    {

    }
}

Итак, я предполагаю, что столбец Discriminator предназначен для отличия ApplicationUser от User. Однако его нет в моей базе данных (которая была создана приложением автоматически).


person Leonardo Herrera    schedule 12.09.2013    source источник
comment
Вы смотрели образец приложения? github.com/rustd/AspnetIdentitySample/tree/master/   -  person sam    schedule 13.09.2013
comment
Там нет ничего, чтобы получить список пользователей. У меня уже есть рабочее приложение, мне просто нужен список всех пользователей.   -  person Leonardo Herrera    schedule 13.09.2013


Ответы (5)


Я обнаружил, что не использую производный объект ApplicationUser ни для чего, поэтому я просто пошел дальше и изменил все его использования на простой старый User. Затем я просто изменил определение ApplicationDbContext на следующее:

public class ApplicationDbContext : IdentityDbContext<
    User, UserClaim, UserSecret, UserLogin,
    Role, UserRole, Token, UserManagement>
{
}

И теперь я могу получить доступ к списку пользователей:

UsersContext = new ApplicationDbContext();
...
UsersContext.Users.ToList();

Однако я думаю, что это вернется и будет преследовать меня в будущем (мне, вероятно, придется добавить больше полей в User), поэтому, вероятно, мне придется использовать тот же подход, что и в этом вопросе:

Получить все имена ролей в системе идентификации ASP.NET MVC5

Изменить. Поскольку мне нужно было добавить новое свойство, мне пришлось отменить свои изменения. Итак, я пошел дальше и провел построчное сравнение с образцом проекта идентификации ASP.NET и обнаружил, что сгенерированный проект имеет следующую строку:

IdentityManager = new AuthenticationIdentityManager(new IdentityStore());

в то время как пример приложения включил контекст базы данных в конструктор. Поэтому я добавил его в свой конструктор, воссоздал базу данных, и проблема исчезла.

IdentityManager = new AuthenticationIdentityManager(new IdentityStore(new ApplicationDbContext()));
person Leonardo Herrera    schedule 13.09.2013
comment
Это меня тоже достало. Я вообще не понимаю, почему включенный шаблон VS2013 RTM настроен таким образом. Может быть причина или это оплошность? - person joelmdev; 05.11.2013
comment
И подождите, чтобы увидеть, что произойдет, когда вы обновите версии RTM до версии 1.0. Все изменилось; к счастью, образец приложения также был изменен, чтобы отразить это. - person Leonardo Herrera; 06.11.2013
comment
Вы имеете в виду RC to RTM? вы имеете в виду этот образец приложения? github.com/rustd/AspnetIdentitySample - person joelmdev; 06.11.2013
comment
Ага, вот и все. Взгляните на , в моем приложении было зафиксировано, что в моем приложении rel="noferofer.com было совершено изменение. соответствовать новой архитектуре. Это заняло у меня пару часов, но вроде работает нормально. - person Leonardo Herrera; 06.11.2013
comment
Ты только что спас мой бекон! Я пытался использовать MembershipUserCollection users = Membership.GetAllUsers (), но он ничего не возвращал, даже с пользователями в моей таблице. Мое приложение использует удостоверение ASP.NET, поэтому членство, вероятно, обращается к устаревшей таблице без пользователей. У меня уже был настроен контекст, поэтому буквально все, что мне нужно было сделать, это взять на себя инициативу и вызвать контекст, захватить его пользователей и преобразовать их в список. БУМ! Работает прекрасно. Посмотрев 20+ S.O. страниц, я рад, что продержался на этом. Спасибо! - person midoriha_senpai; 21.04.2017

  1. Создать ASP .NET MVC5 проект по умолчанию
  2. Создайте ASP .NET Identity таблицы правильно и измените также строку подключения.
  3. Чтобы привлечь пользователей, просто выполните следующий тест A. Перейдите к AccountController B. Создайте любой фиктивный метод и поместите туда
var context = new ApplicationDbContext();

var allUsers = context.Users.ToList();

введите описание изображения здесь

person DmitryBoyko    schedule 06.01.2014
comment
Спасибо. Считайте, что этот вопрос устарел. Этот комментарий может представлять интерес. - person Leonardo Herrera; 07.01.2014

Для RTM вам нужно будет перейти к вашему DbContext или к тому, что ваша конкретная реализация магазина должна перечислить всех пользователей. В следующем выпуске мы, скорее всего, добавим дополнительный метод IQueryable Users / Roles в классы Manager, которые хранилища могут реализовать для предоставления IQueryables как пользователям, так и хранилищам.

person Hao Kung    schedule 16.09.2013
comment
Спасибо. Прямо сейчас я использую IEnumerable<IRole> rolesForUser = await IdentityManager.Store.Roles.GetRolesForUserAsync(user.Id, CancellationToken.None);, от которого мой неподготовленный нос пахнет странно. - person Leonardo Herrera; 16.09.2013
comment
Было бы здорово иметь методы для удаления (удаления) в дополнение к упомянутым вами методам IQueryable Users / Roles. Теперь UserManger Удалить пользовательский метод отсутствует. - person subsci; 22.12.2013
comment
Они доступны сейчас в версии 2.0-alpha1. - person Hao Kung; 27.12.2013

Если мы можем использовать следующий тип Constructor в Identity AccountController.

public AccountController(ApplicationUserManager userManager,
            ISecureDataFormat<AuthenticationTicket> accessTokenFormat)
{
      UserManager = userManager;
      AccessTokenFormat = accessTokenFormat;
}

public ApplicationUserManager UserManager
{
     get
     {
          return _userManager ?? Request.GetOwinContext().GetUserManager<ApplicationUserManager>();
     }
     private set
     {
          _userManager = value;
     }
}

тогда мы можем напрямую использовать объект UserManager для получения списка пользователей, например

var userList= UserManager.Users.ToList();
person Bhavesh Patel    schedule 11.10.2018

Вы можете сделать это, явно указав правильные типы:

var userStore = new UserStore<IdentityUser>();
var userManager = new UserManager<IdentityUser>(userStore);
IQueryable<IdentityUser> usersQuery = userManager.Users;
List<IdentityUser> users = usersQuery.ToList();

Импорт:

using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.EntityFramework;
using System.Linq;
using System.Collections.Generic;
person Nel    schedule 20.05.2020