![](/img/trans.png)
[英]UserManager.GetRoles doesn't work after extending the IdentityUserRole in MVC 5 Dot Net Identity
[英]Authorize and GetRoles doesn't work in ASP.NET Identity
我正在使用使用實體框架實現的ASP.NET Identity 2.1.0。
身份驗證工作正常,但基於角色的安全性存在問題。 盡管我已經向用戶添加了角色,但是此代碼返回空值:
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身份的其他示例中都沒有看到
我使用以下代碼添加了默認的管理員用戶和角色:
public static void Start()
{
var userManager = HttpContext.Current.GetOwinContext().GetUserManager<BasemapUserManager>();
var roleManager = HttpContext.Current.GetOwinContext().Get<ApplicationRoleManager>();
const string name = "someEmail@gmail.com";
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值:
為什么GetRoles對於在數據庫中具有該角色的用戶不返回任何內容? 另外,其他API(例如IsInRole)也無法按預期運行。 是否因為添加到IdentityUserRoles表的外鍵?
問題是添加到身份表中的不必要的列。
由於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
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.