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();
}
}