Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to Extend Microsoft.AspNet.Identity.EntityFramework.IdentityRole

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 IdentityDbContext takes a generic parameter of type IdentityUser. However, IdentityDbContext doesn't allow you to do this for IdentityRole. How can I accomplish this?

I know I can create a basic DbContext, and implement my own IUserStore, so that I can use my own role class, but I really don't want to have to do that.

Any thoughts?

like image 934
Nathan A Avatar asked Apr 27 '26 09:04

Nathan A


2 Answers

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

like image 158
SpeedOfSpin Avatar answered Apr 29 '26 08:04

SpeedOfSpin


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;}
}
like image 36
jd4u Avatar answered Apr 29 '26 07:04

jd4u



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!