Asp.net IdentityRole 和 IdentityUser 的核心 2.0 升级问题
Asp.net core 2.0 upgrade problems with IdentityRole and IdentityUser
我一直在开发一个网络应用程序,该应用程序使用 angular 通用和 asp.net 核心以及 OpenIDDict 令牌身份验证。
我有自定义角色和声明/权限。我从以前为 asp.net 核心 1.1 编写的项目中获取了大量代码,因此我必须创建 IdentityUser 和 IdentityRole 的扩展,我根据 Microsoft 文档更新了这些扩展,包括如图所示的导航属性下面,我的问题是,如果我从数据库中获取角色并包含用户和声明,例如
_context.Roles
.Include(r => r.Claims)
.Include(r => r.Users)
.OrderBy(r => r.Name);
我得到了角色,但用户和声明计数为 0,所以某处没有更新,通过 usermanager 获取用户时也会发生同样的情况,我得到 0 个角色和 0 个声明!如果我使用 rolemanager 检查用户角色,它会工作并且 returns 角色。我也在底部包含了我的 dbContext。希望这是一个简单的修复!
应用程序角色:
public class ApplicationRole : IdentityRole
{
public ApplicationRole()
{
}
public virtual ICollection<ApplicationRoleClaim> Claims { get; set; } = new List<ApplicationRoleClaim>();
public virtual ICollection<ApplicationUser> Users { get; set; } = new List<ApplicationUser>();
public ApplicationRole(string roleName) : base(roleName)
{
}
public ApplicationRole(string roleName, string description) : base(roleName)
{
Description = description;
}
public string Description { get; set; }
}
应用程序用户:
public class ApplicationUser : IdentityUser
{
public virtual string FriendlyName
{
get
{
string friendlyName = string.IsNullOrWhiteSpace(FullName) ? UserName : FullName;
if (!string.IsNullOrWhiteSpace(JobTitle))
friendlyName = JobTitle + " " + friendlyName;
return friendlyName;
}
}
public string JobTitle { get; set; }
public string FullName { get; set; }
public string Configuration { get; set; }
public bool IsEnabled { get; set; }
public bool IsLockedOut => this.LockoutEnabled && this.LockoutEnd >= DateTimeOffset.UtcNow;
public virtual ICollection<IdentityUserRole<string>> Roles { get; } = new List<IdentityUserRole<string>>();
public virtual ICollection<IdentityUserClaim<string>> Claims { get; } = new List<IdentityUserClaim<string>>();
public virtual ICollection<IdentityUserLogin<string>> Logins { get; } = new List<IdentityUserLogin<string>>();
//public ICollection<Order> Orders { get; set; }
}
ApplicationRoleClaim:
public class ApplicationRoleClaim : IdentityRoleClaim<string>
{
public virtual ApplicationRole ApplicationRole { get; set; }
}
数据库上下文:
public class MYDbContext : IdentityDbContext<ApplicationUser, ApplicationRole, string>
{
public MyDbContext(DbContextOptions<MyDbContext> options)
: base(options)
{
Database.EnsureCreated();
}
//List of DB Models - Add your DB models here
public DbSet<Customer> Customers { get; set; }
public DbSet<Product> Product { get; set; }
public virtual DbSet<OpenIddictApplication> OpenIddictApplication { get; set; }
public virtual DbSet<OpenIddictAuthorization> OpenIddictAuthorization { get; set; }
public virtual DbSet<OpenIddictScope> OpenIddictScope { get; set; }
public virtual DbSet<OpenIddictToken> OpenIddictToken { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Product>()
.Property(b => b.EntryTime)
.HasDefaultValueSql("getdate()");
base.OnModelCreating(modelBuilder);
modelBuilder.UseOpenIddict();
modelBuilder.Entity<ApplicationRoleClaim>()
.HasOne(pt => pt.ApplicationRole)
.WithMany(t => t.Claims)
.HasForeignKey(pt => pt.RoleId);
modelBuilder.Entity<ApplicationUser>()
.HasMany(e => e.Claims)
.WithOne()
.HasForeignKey(e => e.UserId)
.IsRequired()
.OnDelete(DeleteBehavior.Cascade);
modelBuilder.Entity<ApplicationUser>()
.HasMany(e => e.Logins)
.WithOne()
.HasForeignKey(e => e.UserId)
.IsRequired()
.OnDelete(DeleteBehavior.Cascade);
modelBuilder.Entity<ApplicationUser>()
.HasMany(e => e.Roles)
.WithOne()
.HasForeignKey(e => e.UserId)
.IsRequired()
.OnDelete(DeleteBehavior.Cascade);
modelBuilder.Entity<ApplicationRole>()
.HasMany(t => t.Claims)
.WithOne(r => r.ApplicationRole)
.HasForeignKey(pt => pt.RoleId);
}
}
编辑:
我注意到我现在得到了用户的角色计数;但是,我无法通过角色获得用户数。我尝试将 link 角色分配给用户,但出现错误。我确实设法 link 声明和角色:
modelBuilder.Entity<ApplicationRole>()
.HasMany(r => r.Claims)
.WithOne()
.HasForeignKey(c => c.RoleId).IsRequired()
.OnDelete(DeleteBehavior.Cascade);
已修复!
更改了我的导航属性以匹配:
应用程序用户:
public virtual ICollection<IdentityUserRole<string>> Roles { get; set; }
public virtual ICollection<IdentityUserClaim<string>> Claims { get; set; }
应用程序角色:
public virtual ICollection<IdentityUserRole<string>> Users { get; set; }
public virtual ICollection<IdentityRoleClaim<string>> Claims { get; set; }
更新了我的 DbContext:
modelBuilder.Entity<ApplicationUser>().HasMany(u => u.Claims).WithOne().HasForeignKey(c => c.UserId).IsRequired().OnDelete(DeleteBehavior.Cascade);
modelBuilder.Entity<ApplicationUser>().HasMany(u => u.Roles).WithOne().HasForeignKey(r => r.UserId).IsRequired().OnDelete(DeleteBehavior.Cascade);
modelBuilder.Entity<ApplicationRole>().HasMany(r => r.Claims).WithOne().HasForeignKey(c => c.RoleId).IsRequired().OnDelete(DeleteBehavior.Cascade);
modelBuilder.Entity<ApplicationRole>().HasMany(r => r.Users).WithOne().HasForeignKey(r => r.RoleId).IsRequired().OnDelete(DeleteBehavior.Cascade);
确保初始迁移看起来没问题。一切都奏效了。
我一直在开发一个网络应用程序,该应用程序使用 angular 通用和 asp.net 核心以及 OpenIDDict 令牌身份验证。
我有自定义角色和声明/权限。我从以前为 asp.net 核心 1.1 编写的项目中获取了大量代码,因此我必须创建 IdentityUser 和 IdentityRole 的扩展,我根据 Microsoft 文档更新了这些扩展,包括如图所示的导航属性下面,我的问题是,如果我从数据库中获取角色并包含用户和声明,例如
_context.Roles
.Include(r => r.Claims)
.Include(r => r.Users)
.OrderBy(r => r.Name);
我得到了角色,但用户和声明计数为 0,所以某处没有更新,通过 usermanager 获取用户时也会发生同样的情况,我得到 0 个角色和 0 个声明!如果我使用 rolemanager 检查用户角色,它会工作并且 returns 角色。我也在底部包含了我的 dbContext。希望这是一个简单的修复!
应用程序角色:
public class ApplicationRole : IdentityRole
{
public ApplicationRole()
{
}
public virtual ICollection<ApplicationRoleClaim> Claims { get; set; } = new List<ApplicationRoleClaim>();
public virtual ICollection<ApplicationUser> Users { get; set; } = new List<ApplicationUser>();
public ApplicationRole(string roleName) : base(roleName)
{
}
public ApplicationRole(string roleName, string description) : base(roleName)
{
Description = description;
}
public string Description { get; set; }
}
应用程序用户:
public class ApplicationUser : IdentityUser
{
public virtual string FriendlyName
{
get
{
string friendlyName = string.IsNullOrWhiteSpace(FullName) ? UserName : FullName;
if (!string.IsNullOrWhiteSpace(JobTitle))
friendlyName = JobTitle + " " + friendlyName;
return friendlyName;
}
}
public string JobTitle { get; set; }
public string FullName { get; set; }
public string Configuration { get; set; }
public bool IsEnabled { get; set; }
public bool IsLockedOut => this.LockoutEnabled && this.LockoutEnd >= DateTimeOffset.UtcNow;
public virtual ICollection<IdentityUserRole<string>> Roles { get; } = new List<IdentityUserRole<string>>();
public virtual ICollection<IdentityUserClaim<string>> Claims { get; } = new List<IdentityUserClaim<string>>();
public virtual ICollection<IdentityUserLogin<string>> Logins { get; } = new List<IdentityUserLogin<string>>();
//public ICollection<Order> Orders { get; set; }
}
ApplicationRoleClaim:
public class ApplicationRoleClaim : IdentityRoleClaim<string>
{
public virtual ApplicationRole ApplicationRole { get; set; }
}
数据库上下文:
public class MYDbContext : IdentityDbContext<ApplicationUser, ApplicationRole, string>
{
public MyDbContext(DbContextOptions<MyDbContext> options)
: base(options)
{
Database.EnsureCreated();
}
//List of DB Models - Add your DB models here
public DbSet<Customer> Customers { get; set; }
public DbSet<Product> Product { get; set; }
public virtual DbSet<OpenIddictApplication> OpenIddictApplication { get; set; }
public virtual DbSet<OpenIddictAuthorization> OpenIddictAuthorization { get; set; }
public virtual DbSet<OpenIddictScope> OpenIddictScope { get; set; }
public virtual DbSet<OpenIddictToken> OpenIddictToken { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Product>()
.Property(b => b.EntryTime)
.HasDefaultValueSql("getdate()");
base.OnModelCreating(modelBuilder);
modelBuilder.UseOpenIddict();
modelBuilder.Entity<ApplicationRoleClaim>()
.HasOne(pt => pt.ApplicationRole)
.WithMany(t => t.Claims)
.HasForeignKey(pt => pt.RoleId);
modelBuilder.Entity<ApplicationUser>()
.HasMany(e => e.Claims)
.WithOne()
.HasForeignKey(e => e.UserId)
.IsRequired()
.OnDelete(DeleteBehavior.Cascade);
modelBuilder.Entity<ApplicationUser>()
.HasMany(e => e.Logins)
.WithOne()
.HasForeignKey(e => e.UserId)
.IsRequired()
.OnDelete(DeleteBehavior.Cascade);
modelBuilder.Entity<ApplicationUser>()
.HasMany(e => e.Roles)
.WithOne()
.HasForeignKey(e => e.UserId)
.IsRequired()
.OnDelete(DeleteBehavior.Cascade);
modelBuilder.Entity<ApplicationRole>()
.HasMany(t => t.Claims)
.WithOne(r => r.ApplicationRole)
.HasForeignKey(pt => pt.RoleId);
}
}
编辑:
我注意到我现在得到了用户的角色计数;但是,我无法通过角色获得用户数。我尝试将 link 角色分配给用户,但出现错误。我确实设法 link 声明和角色:
modelBuilder.Entity<ApplicationRole>()
.HasMany(r => r.Claims)
.WithOne()
.HasForeignKey(c => c.RoleId).IsRequired()
.OnDelete(DeleteBehavior.Cascade);
已修复!
更改了我的导航属性以匹配: 应用程序用户:
public virtual ICollection<IdentityUserRole<string>> Roles { get; set; }
public virtual ICollection<IdentityUserClaim<string>> Claims { get; set; }
应用程序角色:
public virtual ICollection<IdentityUserRole<string>> Users { get; set; }
public virtual ICollection<IdentityRoleClaim<string>> Claims { get; set; }
更新了我的 DbContext:
modelBuilder.Entity<ApplicationUser>().HasMany(u => u.Claims).WithOne().HasForeignKey(c => c.UserId).IsRequired().OnDelete(DeleteBehavior.Cascade);
modelBuilder.Entity<ApplicationUser>().HasMany(u => u.Roles).WithOne().HasForeignKey(r => r.UserId).IsRequired().OnDelete(DeleteBehavior.Cascade);
modelBuilder.Entity<ApplicationRole>().HasMany(r => r.Claims).WithOne().HasForeignKey(c => c.RoleId).IsRequired().OnDelete(DeleteBehavior.Cascade);
modelBuilder.Entity<ApplicationRole>().HasMany(r => r.Users).WithOne().HasForeignKey(r => r.RoleId).IsRequired().OnDelete(DeleteBehavior.Cascade);
确保初始迁移看起来没问题。一切都奏效了。