我正在尝试为我的MVC 5,Identity 2.0项目实现基于角色的安全性。 我一直在网上看一些教程,但有点卡住了。
我创建了以下内容:
public class Role : IdentityRole
{
public Role(string name) : base(name)
{ }
public Role()
{ }
public string Description { get; set; }
public string MenuIcon { get; set; }
public string ControllerName { get; set; }
public string ActionName { get; set; }
}
和我的背景:
new public DbSet<Role> Roles { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
base.OnModelCreating(modelBuilder);
//rename the tables and columns used by the Identity Framework
modelBuilder.Entity<User>().ToTable("User");
modelBuilder.Entity<Role>().ToTable("Role");
modelBuilder.Entity<UserRole>().ToTable("UserRole");
modelBuilder.Entity<IdentityUserLogin>().ToTable("UserLogin");
modelBuilder.Entity<IdentityUserClaim>().ToTable("UserClaim");
}
和我的种子方法:
RoleManager roleManager = new RoleManager(new RoleStore<Role>(context));
roleManager.Create<Role, string>(new Role("Orders"));
但是,当我运行应用程序时,它会为角色创建数据库,其中包含2个表:Role
(这是我希望角色存在的位置,它包含我的自定义属性)和AspNetRoles
。它确实使用我在Seed方法中创建的角色填充两个表。
我在做错的确切是它创建了2个表?
答案 0 :(得分:3)
所有asp.net表都应该识别新表名,而不仅仅是更改的表。
用户表:
public class User : IdentityUser<string, UserLogin, UserRole, UserClaim>
{
// Your properties
}
UserLogin表:
public class UserLogin : IdentityUserLogin { }
UserRole表:
public class UserRole : IdentityUserRole { }
UserClaim表:
public class UserClaim : IdentityUserClaim { }
角色表:此帽子将继承自IdentityRole<string, UserRole>
public class Role : IdentityRole<string, UserRole>
{
//Any relevant properties
public string Description { get; set; }
public string MenuIcon { get; set; }
public string ControllerName { get; set; }
public string ActionName { get; set; }
}
数据上下文:必须从IdentityDbContext<User, Role, string, UserLogin, UserRole, UserClaim>
public class YourDataContext : IdentityDbContext<User, Role, string, UserLogin, UserRole, UserClaim>
{
// Your DbSet items
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<User>().ToTable("User");
modelBuilder.Entity<Role>().ToTable("Role");
modelBuilder.Entity<UserClaim>().ToTable("UserClaim");
modelBuilder.Entity<UserLogin>().ToTable("UserLogin");
modelBuilder.Entity<UserRole>().ToTable("UserRole");
modelBuilder.Entity<User>().Property(r => r.Id);
modelBuilder.Entity<UserClaim>().Property(r => r.Id);
modelBuilder.Entity<Role>().Property(r => r.Id);
//Add your new properties of Role table in here.
}
}
在这个例子中,我使用了string
类型的表格的Id。
希望这有帮助。
答案 1 :(得分:2)
删除此行:
new public DbSet<Role> Roles { get; set; }
然后你必须用你自己的列替换默认的 AspNetRoles 表列。
var applicationRole = modelBuilder.Entity<ApplicationRole>().ToTable("Roles");
applicationRole.Property(r => r.Name).HasColumnName("Description");
...
但是,如果要自定义AspNet标识配置文件,则可以更好地创建新的相关表格(check this link)。