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

【问题讨论】:

您看过示例应用程序吗? 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 类上添加一个可选的 IQueryableUsers/Roles 方法,商店可以实现该方法来为用户和商店公开 IQueryables

【讨论】:

谢谢。现在我正在使用IEnumerable&lt;IRole&gt; 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】:

如果我们可以在IdentityAccountController中使用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 个人资料图片?

如何在 ASP.NET Identity 中获取索赔值的最大值?

ASP.NET Identity 重置密码

ASP.NET Identity 重置密码

ASP.Net Core Identity - 管理其他用户