【问题标题】:How to obtain a list of Users from ASP.NET Identity?如何从 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。但是,它在我的数据库中不存在(由应用程序自动创建。)

【问题讨论】:

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


【解决方案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】:
  1. 默认创建ASP .NET MVC5项目
  2. 正确创建ASP .NET Identity 表并更改连接字符串
  3. 要获取用户,只需执行以下测试 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;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-10-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-08
        • 2016-12-09
        相关资源
        最近更新 更多