Why am I getting an IdentityRole error?

asp.net-identity, asp.net-mvc, asp.net-mvc-5.1, entity-framework, entity-framework-5

Solution

I've spent a lot of time on this issue and posted many questions to get to the bottom of it. I sure hope this information helps other folks.

Basically, customizing the `User` is easy and there are several examples available. However, customizing the `Role` is problematic and the only examples I found were customized far beyond what comes "out of the box" and I was able to get one working after resolving an `Id` issue. The issue in that case was that I had to create the `Id` myself. Here is that issue: UserManager.Create(user, password) thowing EntityValidationError saying Id is required?

So in simple examples, notice when you are just customizing the `User` your `DbContext` inherits from `IdentityDbContext` and you just provide the `IdentityUser`, in my case it was called `ApplicationUser` and looked like this `IdentityDbContext<ApplicationUser>`. Also notice that the `UserManager` and `UserStore` is provided the `IdentityUser` as well, and in most examples looks like this `new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext()))`

But once you customize your `Role` you need to pass everything, including the key type `TKey` of the `Id` fields. Mine looks like this `IdentityDbContext<ApplicationUser, ApplicationRole, string, IdentityUserLogin, IdentityUserRole, IdentityUserClaim>` because I only customized the `User` and `Role`.

But you aren't done yet, because the regular `UserManager` doesn't understand anymore. I think this is something the Identity folks could/should fix, but I digress. So I had to implement my own `UserStore` and `UserManager` and notice (and this is the part that tripped me up) you have to provide the `KType` here too or instantiating your custom `UserManager` will give you a compile-time error:

public class ApplicationUserStore : UserStore<ApplicationUser, ApplicationRole, string, IdentityUserLogin, IdentityUserRole, IdentityUserClaim>
{
    public ApplicationUserStore(MyAppDb context)
        : base(context)
    {
    }
}

public class ApplicationUserManager : UserManager<ApplicationUser, string>
{
    public ApplicationUserManager(IUserStore<ApplicationUser, string> store)
        : base(store)
    {
    }
}

And instantiate the `UserManager` in the Account controller like this `new ApplicationUserManager(new ApplicationUserStore(new MyAppDb()))`:

public class AccountController : BaseController
{
    private ApplicationUserManager _userManager;

    public AccountController()
    {
    }

    public AccountController(ApplicationUserManager userManager)
    {
        UserManager = userManager;
    }

    public ApplicationUserManager UserManager
    {
        get
        {
            return _userManager = new ApplicationUserManager(new ApplicationUserStore(new MyAppDb()));
        }
        private set
        {
            _userManager = value;
        }
    }

    ...

}

Hope this helps!

Problem

Using Identity 2.0 After registering a user, the user is created in the database, there is code in the Account controller to create an identity and sign the user in. This is when I get the error. Here is the code producing the error: ``` var identity = await UserManager.CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie); ``` And here is the error: The entity type IdentityRole is not part of the model for the current context. My Model looks like this: ``` namespace MyApp.Models { public class ApplicationUser : IdentityUser { [Required] [StringLength(50)] public string FirstName { get; set; } [Required] [StringLength(50)] public string LastName { get; set; } } public class ApplicationRole : IdentityRole { [Required] [StringLength(50)] public string ProperName { get; set; } [Required] public string Description { get; set; } } public class MyAppDb : IdentityDbContext<ApplicationUser, ApplicationRole, string, IdentityUserLogin, IdentityUserRole, IdentityUserClaim> { public MyAppDb() : base("MyAppDb") { } } } ``` My `UserManager` is created like this in the Account controller: ``` namespace MyApp.Controllers { [Authorize] public class AccountController : BaseController { private UserManager<ApplicationUser> _userManager; public AccountController() { } public AccountController(UserManager<ApplicationUser> userManager) { UserManager = userManager; } public UserManager<ApplicationUser> UserManager { get { return _userManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new MyAppDb())); } private set { _userManager = value; } } ... } } ```

Original source

Related problems