2014-10-20 59 views
2

我正在使用實體框架實現使用ASP.NET身份2.1.0。
身份驗證正常,但基於角色的安全性存在問題。 雖然我已經添加了角色的用戶,但該代碼返回空:授權和GetRoles在ASP.NET身份不起作用

var roles= UserManager.GetRoles(User.Identity.GetUserId()); 

也是基於登錄的用戶沒有角色的授權。當用戶重定向到下面的應用程序時,應用程序會將其重定向到登錄頁面。

[Authorize(Roles = "Admin")] 
    public abstract partial class AdminAreaController : Controller 
    { 

爲了增加ASP.NET身份,第一,我已經創建自定義的用戶類添加會員數據:

public class BasemapUser : IdentityUser 
{ 
    [MaxLength(100)] 
    public string Name { get; set; } 

    [MaxLength(100)] 
    public string CompanyName { get; set; } 

    public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<BasemapUser> manager) 
    { 
     // Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType 
     ClaimsIdentity userIdentity = 
      await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie); 
     // Add custom user claims here 
     return userIdentity; 
    } 
} 

這是的DbContext類:

public class WebCoreMapDbContext : IdentityDbContext<BasemapUser> 
{ 
    public WebDbContext() 
     : base("WebDbContext") 
    { 
    } 

    public static WebCoreMapDbContext Create() 
    { 
     return new WebCoreMapDbContext(); 
    } 


    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<IdentityUserLogin>().HasKey<string>(l => l.UserId); 
     modelBuilder.Entity<IdentityUserRole>().HasKey(r => new {r.RoleId, r.UserId}); 
    } 
} 

我創建數據庫使用Power Shell中的EF遷移命令。我看到IdentityUserRoles表中的兩個額外列,我還沒有ASP.NET身份的其他樣本

Extra columns in IdentityUserRoles

我用這個代碼添加默認的admin用戶和角色中看到:

 public static void Start() 
    { 
     var userManager = HttpContext.Current.GetOwinContext().GetUserManager<BasemapUserManager>(); 
     var roleManager = HttpContext.Current.GetOwinContext().Get<ApplicationRoleManager>(); 
     const string name = "[email protected]"; 
     const string password = "somePassword"; 
     const string roleName = "Admin"; 

     //Create Role Admin if it does not exist 
     IdentityRole role = roleManager.FindByName(roleName); 
     if (role == null) 
     { 
      role = new IdentityRole(roleName); 
      IdentityResult roleresult = roleManager.Create(role); 
     } 

     BasemapUser user = userManager.FindByName(name); 
     if (user == null) 
     { 
      user = new BasemapUser {UserName = name, Email = name}; 
      IdentityResult result = userManager.Create(user, password); 
      result = userManager.SetLockoutEnabled(user.Id, false); 
     } 

     // Add user admin to Role Admin if not already added 
     IList<string> rolesForUser = userManager.GetRoles(user.Id); 
     if (!rolesForUser.Contains(role.Name)) 
     { 
      IdentityResult result = userManager.AddToRole(user.Id, role.Name); 

     } 
    } 

管理員用戶和角色已成功存儲在數據庫中,但存儲在IdentityUserRoles表中的記錄包含空值:

Null value

爲什麼GetRoles不會爲在數據庫中具有該角色的用戶返回任何內容? IsInRole等其他API也無法按預期工作。是否因爲添加到IdentityUserRoles表的外鍵?

+0

這是什麼'BasemapUser.GenerateUserIdentityAsync'回報? 'ClaimsIdentity'對象在'.Claims'屬性中返回的是什麼? – trailmax 2014-10-20 09:03:54

+0

@trailmax我沒有使用過。它只是從Nuget中的ASP.NET Identity的示例中獲得的。 – Shahin 2014-10-20 09:21:52

+0

不確定樣品是什麼 - 沒有看過它一段時間。但它看起來像你從框架中得到的'ClaimsPrincipal'沒有角色,因爲聲明附加(它應該)。在您的登錄控制器中,嘗試添加此代碼並查看生成的「Claims」列表是否具有所需的角色。 – trailmax 2014-10-20 09:29:02

回答

4

問題是已添加到身份表的不必要的列。

由於DbContext從IdentityDbContext擴展,我必須調用base.OnModelCreating,因爲IdentityDbContext爲映射Identity類定義了它。我沒有叫,在我的代碼引起的問題

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<IdentityUserLogin>().HasKey<string>(l => l.UserId); 
     modelBuilder.Entity<IdentityUserRole>().HasKey(r => new {r.RoleId, r.UserId}); 
    } 

必須改變以

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     base.OnModelCreating(modelBuilder); 

     // modelBuilder.Entity<IdentityUserLogin>().HasKey<string>(l => l.UserId);    // do not add this 
     // modelBuilder.Entity<IdentityUserRole>().HasKey(r => new {r.RoleId, r.UserId});   // do not add this 
     // other mapping codes 
    } 
+1

非常感謝shaahin,經過漫長的鬥爭,我解決了我的問題。和我在這裏分享我的意見,因爲如果任何人面臨同樣的問題,這個解決方案肯定會工作,所有最好的 – 2017-03-13 16:49:41