我正在ASP.NET MVC 5中开发一个应用程序,并且我正在使用Entity Framework。我正在使用visual studio中提供的模板项目作为我自己项目的开始。我希望能够创建一个用户和角色的ViewModel,在那里我可以看到用户列表中的所有角色。
基础项目包括对我有意义的表AspNetUsers
和AspNetUserRoles
。我使用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
类?
我对如何处理此问题非常困惑,建议和指导将不胜感激。
答案 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();