44

编辑:这个问题已经过时了

在我提出这个问题时,身份框架是一个移动的目标。作者改变了很多东西,他们解耦了其他一些东西,让一切变得更容易。

查看github上的Asp.NET Identity Sample 项目。


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

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

4

6 回答 6

31

我发现我没有将派生ApplicationUser对象用于任何事情,所以我继续将它的所有用途更改为普通的 old 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());

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

IdentityManager = new AuthenticationIdentityManager(new IdentityStore(new ApplicationDbContext()));
于 2013-09-13T17:31:51.740 回答
16
  1. ASP .NET MVC5默认创建项目
  2. 正确创建ASP .NET Identity表并更改连接字符串
  3. 要获得用户,只需执行以下测试 A。转到AccountController B。创建任何虚拟方法并将其放在那里
var context = new ApplicationDbContext();

var allUsers = context.Users.ToList();

在此处输入图像描述

于 2014-01-06T16:51:03.840 回答
4

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

于 2013-09-16T17:20:19.693 回答
2
using System.Linq;
using System.Data;
using System.Data.Entity;

        var db = new ApplicationDbContext();
        var Users = db.Users.Include(u => u.Roles);
于 2017-09-26T10:02:48.470 回答
0

如果我们可以使用以下类型的Constructorin 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();
于 2018-10-11T05:53:20.343 回答
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;
于 2020-05-20T09:26:20.293 回答