2014-10-03 53 views
12

使用教程here将用户数据库的主键从字符串更改为int,但我在初始化角色管理器时遇到困难。它曾经使用初始化使用自定义角色初始化ASP.NET身份中的RoleManager

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

如何使用新数据创建角色管理器?

更新:我使用MVC 5和EF 6

+0

完全相同的问题[授权(角色=“管理员”)]'我得到以下错误:'用户实例登录标志不支持此版本的SQL Server 。连接将被关闭' – Zapnologica 2015-04-14 11:01:47

回答

23

您的ApplicationRoleManager可能看起来像这样。因为你必须继承你的customRole类而不是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 2015-02-09 09:54:22

+0

'[Authorize(Roles =“Edit”)]'此后自动工作? – Zapnologica 2015-04-14 11:12:45

+0

它应该按预期工作,没有区别手动直接插入角色到数据库.. – DSR 2015-04-14 15:40:06

3

从你的问题,我不能确定是否使用相同的架构(MVC & EF)。

最近我创建了一个MVC + EF解决方案,使用自定义ApplicationUsers & 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); 

withing startup.auth.cs '更新数据库'朝向角色管理器的链接:

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

嗯,我使用的是MVC 5和EF 6.如果您遵循本教程,他将为IdentityRole,UserStore和RoleStore创建自定义类。编译器不会让我使用。 '新的角色商店(上下文);' – lhhc 2014-10-03 10:17:20

+1

检查我的答案上面。 – DSR 2014-10-03 10:43:35

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