Как получить список пользователей из идентификатора ASP.NET?
Изменение: Этот вопрос устарел
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
. Тем не менее, он не существует в моей базе данных (которая была создана приложением автоматически).
Ответы
Ответ 1
Я узнал, что я не использовал производный объект 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 Identity Sample Project и выяснил, что сгенерированный проект имел следующую строку:
IdentityManager = new AuthenticationIdentityManager(new IdentityStore());
в то время как приложение Sample включало контекст базы данных в конструкторе. Поэтому я добавил его в свой конструктор, воссоздал базу данных, и проблема исчезла.
IdentityManager = new AuthenticationIdentityManager(new IdentityStore(new ApplicationDbContext()));
Ответ 2
- Создайте проект
ASP .NET MVC5
по умолчанию
- Создайте таблицы
ASP .NET Identity
и измените строку соединения.
- Чтобы пользователи просто выполнили следующий тест
A. Перейдите к
AccountController
B. Создайте любой фиктивный метод и поместите туда
var context = new ApplicationDbContext();
var allUsers = context.Users.ToList();
![enter image description here]()
Ответ 3
Для RTM вам нужно будет перейти к DbContext
или независимо от того, какая ваша конкретная реализация хранилища должна перечислить всех пользователей. В следующем выпуске мы, скорее всего, добавим необязательный метод IQueryable
Users/Roles в классах Manager, которые могут быть реализованы, чтобы выставить IQueryables
для пользователей и магазинов.
Ответ 4
using System.Linq;
using System.Data;
using System.Data.Entity;
var db = new ApplicationDbContext();
var Users = db.Users.Include(u => u.Roles);
Ответ 5
Если мы можем использовать следующий тип 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();