ASP MVC用户和角色列表

时间:2016-12-08 11:30:55

标签: c# asp.net entity-framework asp.net-identity viewmodel

我正在ASP.NET MVC 5中开发一个应用程序,并且我正在使用Entity Framework。我正在使用visual studio中提供的模板项目作为我自己项目的开始。我希望能够创建一个用户和角色的ViewModel,在那里我可以看到用户列表中的所有角色。

基础项目包括对我有意义的表AspNetUsersAspNetUserRoles。我使用RoleManager提供的identity类来添加角色,然后将用户添加到该角色。

protected override void Seed(Project.Models.ApplicationDbContext context)
{
    var roleStore = new RoleStore<IdentityRole>(context);
    var roleManager = new RoleManager<IdentityRole>(roleStore);
    const string roleName = "admin";
    var role = roleManager.FindByName(roleName);
    if (role == null)
    {
        role = new IdentityRole(roleName);
        var roleresult = roleManager.Create(role);
    }

    var rolesForUser = userManager.GetRoles(user.Id);
    if (!rolesForUser.Contains(role.Name))
    {
        var result = userManager.AddToRole(user.Id, role.Name); // user.Id is retrieved accordingly
    }
}

这一切都有效。但现在我对如何实际查看所有用户及其角色感到困惑,更具体地说,我如何将数据从AspNetUserRoles绑定到模型上,然后再绑定到ViewModel上,以便我能够看到这个并可能修改? (我试图创建一个管理面板来管理这些用户)。

我会假设我可以通过扩展IdentityRoles类来控制AspNetRoles?但是还有一个IdentityUserRole类?

我对如何处理此问题非常困惑,建议和指导将不胜感激。

2 个答案:

答案 0 :(得分:0)

我不知道实际的解决方案,但我分享这些信息,认为它可能会以某种方式帮助您。我尝试为我的项目创建自己的RoleProvider和MembershipProvider。为此我必须实现这些抽象类,其中包含用于修改与用户相关的数据的函数。 这些是会员提供者中的一些功能....

<property name="hibernate.hbm2ddl.auto">create</property>

这些是RoleProvider中的一些功能

 public class MyMembershipProvider : MembershipProvider
{ UserDb ObjDb;
  UserBs objbs;

public MyMembershipProvider()
    {
        ObjDb = new UserDb();
        objbs = new UserBs();
    }

    public override string ApplicationName
    {
        get
        {
            throw new NotImplementedException();
        }

        set
        {
            throw new NotImplementedException();
        }
    }

    public override bool EnablePasswordReset
    {
        get
        {
            throw new NotImplementedException();
        }
    }

    public override bool EnablePasswordRetrieval
    {
        get
        {
            throw new NotImplementedException();
        }
    }
 }

希望这有点接近你所寻找的东西。祝一切顺利。 以下是我认为您正在谈论的函数,它位于RoleProvider中。

 public class MyRoleProvider:RoleProvider
{ UserDb ObjDb;

public MyRoleProvider()
    {
        ObjDb = new UserDb();
    }
    public override string ApplicationName
    {
        get
        {
            throw new NotImplementedException();
        }

        set
        {
            throw new NotImplementedException();
        }
    }

    public override void AddUsersToRoles(string[] usernames, string[] roleNames)
    {
        throw new NotImplementedException();
    }

    public override void CreateRole(string roleName)
    {
        throw new NotImplementedException();
    }

    public override bool DeleteRole(string roleName, bool throwOnPopulatedRole)
    {
        throw new NotImplementedException();
    }

    public override string[] FindUsersInRole(string roleName, string usernameToMatch)
    {
        throw new NotImplementedException();
    }

    public override string[] GetAllRoles()
    {
        throw new NotImplementedException();
    }
  }

使用此功能,我获得了用户的角​​色/ Privelege。然后我使用IsInRole函数在项目的任何地方使用它,该函数已经存在于IPrincipal类中。

   public class MyRoleProvider:RoleProvider
   { UserDb ObjDb;
  public override string[] GetRolesForUser(string username)
    {
        string[] s = { ObjDb.GetAll().Where(x => x.Username ==username.ToUpper()).FirstOrDefault().Privleges };
        return s;
    }
  }

答案 1 :(得分:0)

首先在App_Start/Startup.Auth.cs注册角色管理器,如下所示:

public void ConfigureAuth(IAppBuilder app)
{
    app.CreatePerOwinContext(ApplicationDbContext.Create);
    app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
    app.CreatePerOwinContext<ApplicationSignInManager>(ApplicationSignInManager.Create);

    // register role manager
    app.CreatePerOwinContext<RoleManager<IdentityRole>>((o, c) => 
        new RoleManager<IdentityRole>(
            new RoleStore<IdentityRole>(c.Get<ApplicationDbContext>())));
    // other codes here
}

然后在动作方法中写下:

var users = HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>().Users;
var roles = HttpContext.GetOwinContext().GetUserManager<RoleManager<IdentityRole>>().Roles;

var usersWithRoles= users.Select(u =>
    new
    {
        UserName = u.UserName,
        Roles = roles.Where(r => u.Roles.Any(ur => ur.RoleId == r.Id)).Select(r => r.Name)
    })
   .ToList();