Подтвердить что ты не робот

Как получить список пользователей из идентификатора 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. Тем не менее, он не существует в моей базе данных (которая была создана приложением автоматически).

4b9b3361

Ответ 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();