gpt4 book ai didi

c# - 无法解析类型 'Microsoft.AspNetCore.Identity.RoleManager` 的服务

转载 作者:行者123 更新时间:2023-11-30 15:52:42 27 4
gpt4 key购买 nike

我在我的 asp.net core 项目中编写用于向用户添加角色的代码

这是我的角色 Controller 。

public class RolesController : Controller
{
RoleManager<IdentityRole> _roleManager;
UserManager<AspNetUsers> _userManager;
public RolesController(RoleManager<IdentityRole> roleManager, UserManager<AspNetUsers> 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)
{
// получаем пользователя
AspNetUsers 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)
{

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

但是当我运行应用程序并转到角色 Controller 时。我得到这个错误

An unhandled exception occurred while processing the request. InvalidOperationException: Unable to resolve service for type 'Microsoft.AspNetCore.Identity.RoleManager`1[Microsoft.AspNetCore.Identity.IdentityRole]' while attempting to activate 'VchasnoCrm.Controllers.RolesController'. Microsoft.Extensions.DependencyInjection.ActivatorUtilities.GetService(IServiceProvider sp, Type type, Type requiredBy, bool isDefaultParameterRequired)

我该如何解决这个问题?

最佳答案

在 Net Core 3.1 中有两种不同的 ASP.NET Core Identity 重载,第一个版本名为 DefaultIdentity,您没有机会同时设置 User 和 Roles,因此语法如下所示

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

身份的第二个版本使用用户和角色,看起来像

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

这是不同版本的身份,第一个包含 IdentityUI,第二个不包含 IdentityUI。但是,如果您将角色服务添加为

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

如果您已将角色服务包含到您的服务集中,您可以将角色注入(inject)到 Configure 方法中

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

如果您注入(inject),通常会出现此错误消息

RoleManager<IdentityRole> roleManager

在项目的任何地方,无需添加 IdentityRole 服务(通过第一种或第二种方式)。

关于c# - 无法解析类型 'Microsoft.AspNetCore.Identity.RoleManager` 的服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53801168/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com