如何从 ASP.NET Identity 获取用户列表?
Posted
技术标签:
【中文标题】如何从 ASP.NET Identity 获取用户列表?【英文标题】:How to obtain a list of Users from ASP.NET Identity? 【发布时间】:2013-09-17 09:43:02 【问题描述】:编辑:这个问题已经过时了
在我提出这个问题的那一刻,身份框架是一个移动的目标。作者改变了很多东西,他们解耦了其他一些东西,让一切变得更容易。
看看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
。但是,它在我的数据库中不存在(由应用程序自动创建。)
【问题讨论】:
您看过示例应用程序吗? github.com/rustd/AspnetIdentitySample/tree/master/… 没有什么可以获取用户列表的。我已经有一个工作应用程序,我只需要一个所有用户的列表。 【参考方案1】:我发现我没有将派生的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());
虽然示例应用程序在构造函数中包含了数据库上下文。所以我在构造函数中添加了它,重新创建了数据库,问题就消失了。
IdentityManager = new AuthenticationIdentityManager(new IdentityStore(new ApplicationDbContext()));
【讨论】:
这也吸引了我。我完全不明白为什么包含的 VS2013 RTM 模板是这样配置的。可能有原因还是这是疏忽? 等着看你用 1.0 更新 RTM 版本时发生了什么。一切都变了;幸运的是,示例应用程序也进行了更改以反映这一点。 您的意思是 RC 到 RTM?你指的是这个示例应用程序吗? github.com/rustd/AspnetIdentitySample 是的,就是这样。看看this commit - 我必须更改我的应用程序以适应新架构。我花了几个小时,但它似乎工作正常。 你刚刚救了我的培根!我一直在尝试使用 MembershipUserCollection users = Membership.GetAllUsers(),但它一直没有返回任何内容,即使我的表中有用户。我的应用程序正在使用 ASP.NET 标识,因此 Membership 可能正在访问一个没有用户的已弃用表。我已经设置了上下文,所以实际上我所要做的就是带头调用上下文,抓住它的用户,然后投射到一个列表中。繁荣!它工作得很好。在看了 20+ S.O.页,我很高兴我坚持这一页。谢谢!【参考方案2】:-
默认创建
ASP .NET MVC5
项目
正确创建ASP .NET Identity
表并更改连接字符串。
要获取用户,只需执行以下测试
A. 转至AccountController
B. 创建任何虚拟方法并放在那里
var context = new ApplicationDbContext(); var allUsers = context.Users.ToList();
【讨论】:
谢谢。请考虑这个问题已经过时了。 This comment 可能感兴趣。【参考方案3】:对于 RTM,您必须下拉到您的 DbContext
或您的特定商店实施必须枚举所有用户的任何内容。在下一个版本中,我们很可能会在 Manager 类上添加一个可选的 IQueryable
Users/Roles 方法,商店可以实现该方法来为用户和商店公开 IQueryables
。
【讨论】:
谢谢。现在我正在使用IEnumerable<IRole> rolesForUser = await IdentityManager.Store.Roles.GetRolesForUserAsync(user.Id, CancellationToken.None);
,我未经训练的鼻子闻起来很奇怪。
除了您提到的 IQueryable 用户/角色方法之外,还有删除(删除)方法会很棒。现在缺少 UserManger 删除用户方法。
这些现在在 2.0-alpha1 版本中可用【参考方案4】:
using System.Linq;
using System.Data;
using System.Data.Entity;
var db = new ApplicationDbContext();
var Users = db.Users.Include(u => u.Roles);
【讨论】:
【参考方案5】:如果我们可以在Identity
AccountController
中使用Constructor
的以下类型。
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();
【讨论】:
【参考方案6】:您可以通过显式设置权限类型来做到这一点:
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;
【讨论】:
以上是关于如何从 ASP.NET Identity 获取用户列表?的主要内容,如果未能解决你的问题,请参考以下文章
ASP.net Identity 2.1 获取所有具有角色的用户
如何使用 ASP.Net Core Identity 从登录用户中检索 Google 个人资料图片?