我正在在ASP.NET MVC 5中开发一个应用程序,并且我正在使用实体框架。我使用的是在Visual Studio中提供的模板项目作为我自己项目的开始。我希望能够创建一个用户和角色的ViewModel,我可以在其中看到一个用户列表与他们拥有的所有角色。
基本项目包括对我有意义的表AspNetUsers
和AspNetUserRoles
。我已经使用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
}