2016-12-08 4 views
1

Я разрабатываю приложение в ASP.NET MVC 5, и я использую Entity Framework. Я использую проект шаблона, который предоставляется в визуальной студии как начало моего собственного проекта. Я хотел бы иметь возможность создавать ViewModel для пользователей и ролей, где я могу видеть список пользователей против всех ролей, которые у них есть.ASP MVC Список пользователей и ролей

Базовый проект включает в себя таблицы 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 для меня, чтобы иметь возможность увидеть это и, возможно, изменить ? (Я пытаюсь создать панель администратора для управления этими пользователями).

Я бы предположил, что могу получить контроль над AspNetRoles, возможно расширив класс IdentityRoles? Но есть также класс IdentityUserRole?

Я очень смущен тем, как я могу подойти к этой проблеме, и рекомендации будут оценены.

ответ

0

Я не знаю фактического решения, но я делюсь этой информацией, думая, что это может помочь вам в чем-то или другом. Я попытался создать свой собственный RoleProvider и MembershipProvider для своего проекта. Для этого мне пришлось реализовать эти абстрактные классы, которые содержали функции для изменения данных, связанных с пользователем. Вот некоторые из функций поставщика членства ....

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

Надежда это несколько близко к тому, что вы искали. Всего наилучшего. Вот функция, о которой, я думаю, вы говорите, что находится в RoleProvider.

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

С помощью этой функции я получаю роль/Privelege пользователя. Затем я использую его в любом месте проекта, используя функцию IsInRole, которая уже существует в классе IPrincipal.

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

ли ваш пользовательский класс наследоваться от 'IdentityUser'? Потому что это то, откуда приходит мое замешательство. Теперь я могу получить список ролей из 'IdentityUserRoles' на' db.MyIdentityUser.Roles', но это возвращается как список идентификаторов, а не объект 'Role'. Мне интересно, как я могу попытаться связать «IdentityRole» с «IdentityUser», а точнее, как я могу реализовать эти классы из «Microsoft.AspNet.Identity». – Toby

+0

@Toby ..... Да, Тоби ... есть функция GetRolesForUser в RoleProvider, в которой я написал запрос LINQ, который получает роли пользователя, тогда я использую его в любом месте моего проекта, используя User.IsInRole ("ADMIN") ..... – Sudhanshu

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

Можете ли вы объяснить, что там происходит в 'ConfigureAuth'? –

+1

@BradleyUffner Я зарегистрировал роль менеджера в контексте OWIN. Таким образом, для каждого запроса, создаваемого ролевым менеджером, можно получить доступ, вызвав метод HttpContext.GetOwinContext(). –

Смежные вопросы