I want to be able to extend the default implementation of IdentityRole to include fields like Description. It\'s easy enough to do this for IdentityUser because IdentityDbCo
UserManager<TUser>
uses UserStore<TUser>
as its user store (IUserStore
). UserManager
works with UserStore
for adding and removing user to a role name
as IUserRole.
Likewise, there are interfaces IRole
& IRoleStore<TRole>
for IdentityRole
and RoleStore<TRole>
where TRole
is IdentityRole
. This is to work plainly with Roles directly.
So you can inherit IdentityRole
and add additional information. Use RoleStore<MyRole>
to manage it along additional information.
RoleManager<TRole>
provides core interaction methods for Role, which can use MyRoleStore.
MyIdentityRole.cs
public class MyIdentityRole: IdentityRole
{
public String Description { get; set;}
}
I have just gone through this pain myself. It actually turned out to be pretty simple. Just extend IdentityRole with your new properties.
public class ApplicationRole : IdentityRole
{
public ApplicationRole(string name)
: base(name)
{ }
public ApplicationRole()
{ }
public string Description { get; set; }
}
Then you need to add the line
new public DbSet<ApplicationRole> Roles { get; set; }
into your ApplicationDbContext class like this otherwise you will get errors.
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public ApplicationDbContext()
: base("DefaultConnection")
{}
new public DbSet<ApplicationRole> Roles { get; set; }
}
thats all I needed to do. Make sure you change all instances of IdentityRole to ApplicationRole including anything you are seeding. Also, dont forget to issue a "update-database" to apply the changes to your DB. Any existing rows in there won't be seen by your new RoleManager unless you have the "ApplicationRole" set as a discriminator. You can easily add this yourself.
HTH
Erik