Unable to resolve service for type 'Microsoft.AspNetCore.Identity.RoleManager`

I have encountered a similar issue using .net core 3.0, identity Server 4 & angular SPA default template (Project auto-generated by Rider).

In my case Startup.cs contained:

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

I had to add .AddRoles<IdentityRole>() and change it to:

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

In Net Core 3.1 there are two different overload of ASP.NET Core Identity, first version named DefaultIdentity, You have not opportunity to set simultaneously User and Roles, so syntax look as

services.AddDefaultIdentity<IdentityUser>(options => ...

Second version of Identity use User and Roles and look as

services.AddIdentity<IdentityUser, IdentityRole>(options => ...

It's different version of identity, first include IdentityUI, second not include IdentityUI. But, you CAN include roles to first version, if you add Roles services as

services.AddDefaultIdentity<IdentityUser>(options =>...).AddRoles<IdentityRole>()...

If you have included Roles services to your set of services, you can inject Roles to Configure method as

public void Configure(IApplicationBuilder app, IWebHostEnvironment env, DbContextOptions<ApplicationDbContext> identityDbContextOptions, UserManager<IdentityUser> userManager, RoleManager<IdentityRole> roleManager)

this error message usually appear if you inject

RoleManager<IdentityRole> roleManager

in any place of your project without adding IdentityRole services (by first or second way).


In startup.cs file, you must add .addRoles<IdentityRole>() in one of the services:

services.AddDefaultIdentity<Usuarios>(options => options.SignIn.RequireConfirmedAccount = true)
  .AddRoles<IdentityRole>() //Line that can help you
  .AddEntityFrameworkStores<ApplicationDbContext>();

So for make this works, I need to add this row to Startup.cs file

services.AddIdentity<IdentityUser, IdentityRole>() .AddEntityFrameworkStores<ApplicationDbContext>();

And Change my Roles controller like this

public class RolesController : Controller
{
    RoleManager<IdentityRole> _roleManager;
    UserManager<IdentityUser> _userManager;
    public RolesController(RoleManager<IdentityRole> roleManager, UserManager<IdentityUser> userManager)
    {
        _roleManager = roleManager;
        _userManager = userManager;
    }
    public IActionResult Index() => View(_roleManager.Roles.ToList());

    public IActionResult Create() => View();
    [HttpPost]
    public async Task<IActionResult> Create(string name)
    {
        if (!string.IsNullOrEmpty(name))
        {
            IdentityResult result = await _roleManager.CreateAsync(new IdentityRole(name));
            if (result.Succeeded)
            {
                return RedirectToAction("Index");
            }
            else
            {
                foreach (var error in result.Errors)
                {
                    ModelState.AddModelError(string.Empty, error.Description);
                }
            }
        }
        return View(name);
    }

    [HttpPost]
    public async Task<IActionResult> Delete(string id)
    {
        IdentityRole role = await _roleManager.FindByIdAsync(id);
        if (role != null)
        {
            IdentityResult result = await _roleManager.DeleteAsync(role);
        }
        return RedirectToAction("Index");
    }

    public IActionResult UserList() => View(_userManager.Users.ToList());

    public async Task<IActionResult> Edit(string userId)
    {
        // получаем пользователя
        IdentityUser user = await _userManager.FindByIdAsync(userId);
        if(user!=null)
        {
            // получем список ролей пользователя
            var userRoles = await _userManager.GetRolesAsync(user);
            var allRoles = _roleManager.Roles.ToList();
            ChangeRoleViewModel model = new ChangeRoleViewModel
            {
                UserId = user.Id,
                UserEmail = user.Email,
                UserRoles = userRoles,
                AllRoles = allRoles
            };
            return View(model);
        }

        return NotFound();
    }
    [HttpPost]
    public async Task<IActionResult> Edit(string userId, List<string> roles)
    {
        // получаем пользователя
        IdentityUser user = await _userManager.FindByIdAsync(userId);
        if(user!=null)
        {
            // получем список ролей пользователя
            var userRoles = await _userManager.GetRolesAsync(user);
            // получаем все роли
            var allRoles = _roleManager.Roles.ToList();
            // получаем список ролей, которые были добавлены
            var addedRoles = roles.Except(userRoles);
            // получаем роли, которые были удалены
            var removedRoles = userRoles.Except(roles);

            await _userManager.AddToRolesAsync(user, addedRoles);

            await _userManager.RemoveFromRolesAsync(user, removedRoles);

            return RedirectToAction("UserList");
        }

        return NotFound();
    }
}