如何从ASP.NET身份获取用户列表?

时间:2013-09-12 20:32:46

标签: asp.net asp.net-mvc-5 asp.net-identity asp.net-membership

编辑:此问题已过时

我问这个时,身份框架是一个移动目标。作者改变了很多东西,他们将其他几个分开,使一切变得更容易。

查看Asp.NET Identity Sample project on github


我正在创建一个需要用户管理的小应用程序。不允许注册,而是有一个超级用户将创建和修改登录信息。

我正在使用新的ASP.NET Identity会员系统,果然,创建用户和添加角色非常简单直观。

现在,我的问题:如何使用生成的AccountController类使用的AuthenticationIdentityManager类获取用户列表?我找不到从我的控制器访问用户列表的方法。

(顺便说一句,新名称“身份”对某些人来说可能听起来很棒,但搜索却很痛苦。)

修改:如果我尝试这样做

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。但是,它在我的数据库中不存在(由应用程序自动创建。)

6 个答案:

答案 0 :(得分:29)

我发现我没有使用派生的ApplicationUser对象进行任何操作,因此我继续使用它来改变普通旧User的所有用途。然后我刚刚更改了以下ApplicationDbContext定义:

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

现在我可以访问用户列表:

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

但是,我认为这将会回来并在将来困扰我(我可能需要向User添加更多字段)所以我可能必须使用与此问题相同的方法:

Get all role names in ASP.NET MVC5 Identity system

编辑:由于我需要添加新属性,因此我必须还原我的更改。所以我继续与ASP.NET Identity Sample Project进行逐行比较,发现生成的项目有以下几行:

IdentityManager = new AuthenticationIdentityManager(new IdentityStore());

而Sample应用程序已在构造函数中包含数据库上下文。所以我在构造函数中添加了它,重新创建了数据库,问题就消失了。

IdentityManager = new AuthenticationIdentityManager(new IdentityStore(new ApplicationDbContext()));

答案 1 :(得分:15)

  1. 默认情况下创建ASP .NET MVC5项目
  2. 正确创建ASP .NET Identity表并更改连接字符串
  3. 让用户进行以下测试 A.转到AccountController B.创建任何虚拟方法并放在那里
  4. var context = new ApplicationDbContext();
    
    var allUsers = context.Users.ToList();
    

    enter image description here

答案 2 :(得分:4)

对于RTM,您必须下拉到DbContext或您的特定商店实施必须枚举所有用户的任何内容。在下一个版本中,我们很可能会在Manager类上添加一个可选的IQueryable Users / Roles方法,这些方法可以实现为用户和商店公开IQueryables

答案 3 :(得分:2)

using System.Linq;
using System.Data;
using System.Data.Entity;

        var db = new ApplicationDbContext();
        var Users = db.Users.Include(u => u.Roles);

答案 4 :(得分:0)

如果我们可以在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();

答案 5 :(得分:0)

您可以通过明确设置正确的类型来做到这一点:

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;