Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Store does not implement IUserRoleStore<TUser> ASP.NET Core Identity

I'm using ASP.NET Core 2.1 Identity. I've overridden IdentityUser because I need to add some additional properties on the user.

In Startup.cs

services.AddDefaultIdentity<PortalUser>().AddEntityFrameworkStores<ApplicationDbContext>(); 

ApplicationDbContext.cs

public partial class ApplicationDbContext : IdentityDbContext<PortalUser> {     public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options)     {      } } 

PortalUser class

public class PortalUser : IdentityUser {     [PersonalData]     public DateTime? LastLoginDateUtc { get; set; }      [PersonalData]     public DateTime? RegistrationDateUtc { get; set; } } 

That's all working fine. I can add a user via.

_userManager.CreateAsync(user) 

However, when I call AddToRolesAsync to add a role to a user, I'm getting an exception. Any ideas why?

_userManager.AddToRolesAsync(user, new List<string> { roleName });  {System.NotSupportedException: Store does not implement IUserRoleStore<TUser>.    at Microsoft.AspNetCore.Identity.UserManager`1.GetUserRoleStore()    at Microsoft.AspNetCore.Identity.UserManager`1.AddToRolesAsync(TUser user, IEnumerable`1 roles)} 
like image 823
John81 Avatar asked Sep 26 '18 16:09

John81


2 Answers

In Startup.cs, I was missing AddRoles so

services.AddDefaultIdentity<PortalUser>()     .AddEntityFrameworkStores<ApplicationDbContext>(); 

should be

services.AddDefaultIdentity<PortalUser>()     .AddRoles<IdentityRole>()     .AddEntityFrameworkStores<ApplicationDbContext>(); 

Note: The order is critical. AddRoles must come before AddEntityFrameworkStores

like image 164
John81 Avatar answered Sep 18 '22 04:09

John81


For there are not any answers about the solution in asp.net Core 2.2, I would like to share the same error I meet in asp.net Core 2.2

First, here is another solution for the same error in asp.net core 2.1 https://github.com/aspnet/AspNetCore.Docs/issues/8683

And thanks to the author's idea, I meet the problem when I follow the official guidance in asp.net core 2.2 (the url is in here : MicrosoftDocs For asp.net core 2.2). When I finish the step he says and try to run the project, it throws a exception "Store does not implement IUserRoleStore"

and the problem is : actually, this is the sample for asp.net core 2.1 (And I strongly doubt that why the Microsoft will provide users a docs with not any sample codes, which can't make sense probably)

And you will find that, in Areas/Identity/Data/IdentityHostingStartup.cs IdentityHostingStartup::Configure method you have the following codes :

services.AddDefaultIdentity<IdentityUser>().AddEntityFrameworkStores<ApplicationDbContext>(); 

which is same as the code you should add in /Program.cs ConfigureService as the step : Add Role services to Identity in docs mentioned :

services.AddDefaultIdentity<IdentityUser>().AddRoles<IdentityRole>().AddEntityFrameworkStores<ApplicationDbContext>(); 

so if you meet the same problem in asp.net core 2.2, an alternative solution is :

  1. Following the docs in asp.net 2.2
  2. When you meet this Chapter : Add Role services to Identity , just ignore the official docs and do it :

replace the row

services.AddDefaultIdentity<IdentityUser>().AddEntityFrameworkStores<ApplicationDbContext>(); 

with

services.AddDefaultIdentity<IdentityUser>().AddRoles<IdentityRole>().AddEntityFrameworkStores<ApplicationDbContext>(); 

in Areas/Identity/Data/IdentityHostingStartup.cs IdentityHostingStartup::Configure method, but not add it in program.cs (the file can't be deleted in asp.net core 2.2)

The project I use Asp.net Identity will be updated later in my repos : UWPHelper , Good Luck :)

like image 36
Zyuuu Avatar answered Sep 18 '22 04:09

Zyuuu