2014-10-03 88 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") 
      ; 
     } 
    }