ASP MVC用户和角色列表



我正在在ASP.NET MVC 5中开发一个应用程序,并且我正在使用实体框架。我使用的是在Visual Studio中提供的模板项目作为我自己项目的开始。我希望能够创建一个用户和角色的ViewModel,我可以在其中看到一个用户列表与他们拥有的所有角色。

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

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类?

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

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();

我不知道实际解决方案,但是我正在分享此信息,以为它可能会以某种方式对您有所帮助。我尝试为我的项目创建自己的Roleprovider和MemberHippRovider。为此,我必须实现这些抽象类,以调整与用户相关的数据。这些是会员提供者中的一些功能..

 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();
    }
  }

希望这与您要搜索的内容有些近。一切顺利。这是我认为您正在谈论的功能。

   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;
    }
  }

使用此功能,我获得了用户的角色/特权。然后,我使用Isinrole函数在项目中的任何地方使用它,该功能已在Iprincipal类中。

 if (User.IsInRole("SUPERADMIN"))
        {
          //Do something for SUPERADMIN
        }

最新更新