I have an ASP.NET Core app that uses Identity. It works, but when I am trying to add custom roles to the database I run into problems.
In Startup ConfigureServices
I have added Identity and the role manager as a scoped service like this:
services.AddIdentity<Entities.DB.User, IdentityRole<int>>()
.AddEntityFrameworkStores<MyDBContext, int>();
services.AddScoped<RoleManager<IdentityRole>>();
and in Startup Configure
I inject RoleManager and pass it to my custom class RolesData
:
public void Configure(
IApplicationBuilder app,
IHostingEnvironment env,
ILoggerFactory loggerFactory,
RoleManager<IdentityRole> roleManager
)
{
app.UseIdentity();
RolesData.SeedRoles(roleManager).Wait();
app.UseMvc();
This is the RolesData
class:
public static class RolesData
{
private static readonly string[] roles = new[] {
"role1",
"role2",
"role3"
};
public static async Task SeedRoles(RoleManager<IdentityRole> roleManager)
{
foreach (var role in roles)
{
if (!await roleManager.RoleExistsAsync(role))
{
var create = await roleManager.CreateAsync(new IdentityRole(role));
if (!create.Succeeded)
{
throw new Exception("Failed to create role");
}
}
}
}
}
The app builds without errors, but when trying to access it I get the following error:
Unable to resolve service for type 'Microsoft.AspNetCore.Identity.IRoleStore`1[Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityRole]' while attempting to activate 'Microsoft.AspNetCore.Identity.RoleManager
What am I doing wrong? My gut says there's something wrong with how I add the RoleManager as a service.
PS: I have used "No authentication" when creating the project to learn Identity from scratch.
The registration part is actually fine, tho' you should remove
services.AddScoped<RoleManager<IdentityRole>>()
, as the role manager is already added for you byservices.AddIdentity()
.Your issue is most likely caused by a generic type mismatch: while you call
services.AddIdentity()
withIdentityRole<int>
, you try to resolveRoleManager
withIdentityRole
, which is an equivalent ofIdentityRole<string>
(string
being the default key type in ASP.NET Core Identity).Update your
Configure
method to take aRoleManager<IdentityRole<int>>
parameter and it should work.