2014-10-03 3 views
12

Я изменил первичный ключ для пользовательской базы данных из строки в int с помощью учебника here, но мне трудно инициализировать диспетчер ролей. Он использовался для инициализации с использованиемИнициализация RoleManager в Identity ASP.NET с настраиваемыми ролями

var roleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(context)); 

Как создать диспетчер ролей, используя новые данные?

Обновление: Я использую MVC 5 и EF 6.

+0

точно такой же вопрос, который я имею, если я использую '[Авторизовать (Roles =«Admin»)]' я получаю следующее сообщение об ошибке: 'Флаг Логин экземпляра пользователя не поддерживается в данной версии SQL Server , Соединение будет закрыто' – Zapnologica

ответ

23

Ваш ApplicationRoleManager может выглядеть следующим образом. потому что вы должны унаследовать свой собственный классRole вместо IdentityRole.

public class ApplicationRoleManager : RoleManager<CustomRole, int> 
{ 
    public ApplicationRoleManager(IRoleStore<CustomRole, int> roleStore) 
     : base(roleStore) 
    { 
    } 

    public static ApplicationRoleManager Create(IdentityFactoryOptions<ApplicationRoleManager> options, IOwinContext context) 
    { 
     return new ApplicationRoleManager(new RoleStore<CustomRole, int, CustomUserRole>(context.Get<ApplicationDbContext>())); 
    } 
} 

Затем добавьте следующий код в класс Startup.Auth.cs, если он еще не существует.

app.CreatePerOwinContext<ApplicationRoleManager>(ApplicationRoleManager.Create); 

Затем вы создаете и управляете ролями.

var roleManager = HttpContext.GetOwinContext().Get<ApplicationRoleManager>(); 

    const string roleName = "Admin"; 

    //Create Role Admin if it does not exist 
    var role = roleManager.FindByName(roleName); 
    if (role == null) 
    { 
     role = new CustomRole(); 
     role.Id = 1; // this will be integer 
     role.Name = roleName; 

     var roleresult = roleManager.Create(role); 
    } 

Надеюсь, это поможет.

+1

по какой-то причине строка startup.auth.cs отсутствовала в одном проекте, а менеджер ролей не инициализировался, это решило мою проблему. Спасибо. – Jay

+0

Будет ли [[Авторизовать (Роли = «Изменить»)] 'Автоматически работать после этого? – Zapnologica

+0

Должна быть работа, как ожидалось, без разницы между ручной вставкой ролей непосредственно в базу данных. – DSR

3

Из вашего вопроса я не могу определить, если вы используете одни и те же рамки (MVC & EF).

Недавно я создал решение MVC + EF с использованием пользовательских приложений-приложений & IdentityRoles. ApplicationUser происходит от "Microsoft.AspNet.Identity.EntityFramework.IdentityUser". ApplicationRoles реализованы без изменений.

У меня есть следующий класс:

// Configure the used in the application. RoleManager is defined in the ASP.NET Identity core assembly 
    public class ApplicationRoleManager : RoleManager<IdentityRole> 
    { 
     public ApplicationRoleManager(IRoleStore<IdentityRole, string> roleStore) 
      : base(roleStore) 
     { 
     } 

     public static ApplicationRoleManager Create(IdentityFactoryOptions<ApplicationRoleManager> options, IOwinContext context) 
     { 
      return new ApplicationRoleManager(new RoleStore<IdentityRole>(context.Get<ApplicationDbContext>())); 
     } 
    } 

в configuration.cs (миграции) ==> на 'обновление-базы данных' это будет выполнена

var roleStore = new RoleStore<IdentityRole>(context); 
    var roleManager = new RoleManager<IdentityRole>(roleStore); 
    var applicationRoleAdministrator = new IdentityRole("Administrator"); 
    if (!roleManager.RoleExists(applicationRoleAdministrator.Name)) 
    { 
     roleManager.Create(applicationRoleAdministrator); 
    } 
// do some logic to find your applicationUserAdministrator 
var applicationUserAdministrator = userManager.FindByName("Administrator"); 
userManager.AddToRole(applicationUserAdministrator.Id, applicationRoleAdministrator.Name); 

жгутов startup.auth.cs увязка к RoleManager:

app.CreatePerOwinContext<ApplicationRoleManager>(ApplicationRoleManager.Create); 
+0

Ну, я использую MVC 5 и EF 6. Если вы следуете учебному курсу, он создает пользовательские классы для IdentityRole, UserStore и RoleStore. Компилятор мне не разрешил. 'new RoleStore (контекст);' – lhhc

+1

Проверьте мой ответ выше. – DSR

1

Надеюсь, что это поможет.

var roleManager = new RoleManager<CustomRole,int>(new RoleStore<CustomRole,int,CustomUserRole>(context)); 
    var UserManager = new UserManager<ApplicationUser,int>(new UserStore<ApplicationUser,CustomRole,int,CustomUserLogin,CustomUserRole,CustomUserClaim>(context)); 

    // In Startup iam creating first Admin Role and creating a default Admin User  
    if (!roleManager.RoleExists("Admin")){ 
    //first we create Admin rool 
     var role = new CustomRole(); 
     role.Name = "Admin"; 
     roleManager.Create(role); 
    } 

    ////Here we create a Admin super user who will maintain the website  
    if (UserManager.FindByName("Admin") == null){ 
     var user = new ApplicationUser() { UserName = "Admin" }; 
     string userPWD = "adminadmin"; 
     var chkUser = UserManager.Create(user, userPWD); 
     if (chkUser.Succeeded){ 
      var result1 = UserManager.AddToRole(user.Id, "Admin") 
      ; 
     } 
    } 
Смежные вопросы