Я хочу использовать UserManager в своем веб-приложении. Приложение создается с asp. net core 3.0. Мне нужно, чтобы пользователи с заданной ролью (скажем, CustomerRole) имели собственный контроллер. Обычно я бы использовал это:
public class CustomerController : Controller
{
private readonly IUnitOfWork _unitOfWork;
private readonly UserManager<ApplicationUser> _userManager;
public CustomerController(IUnitOfWork unitOfWork, UserManager<ApplicationUser> userManager)
{
_unitOfWork = unitOfWork;
_userManager = userManager;
}
public IActionResult OnGet()
{
return Json(new { data = _userManager.GetUsersInRoleAsync("CustomerRole").Result });
}
}
И этот код возвращает ошибку 500. UserManager также не инициализируется. Я проверил, что с помощью приведенного ниже кода работает как задумано. Однако я не могу получить пользователей с указанной c ролью. Это не хочу, я хочу достичь.
public class CustomerController : Controller
{
private readonly IUnitOfWork _unitOfWork;
private readonly UserManager<ApplicationUser> _userManager;
public CustomerController(IUnitOfWork unitOfWork)
{
_unitOfWork = unitOfWork;
}
[HttpGet]
public IActionResult OnGet()
{
return Json(new { data = _unitOfWork.Customer.GetAll() });
}
}
Вот ApplicationUser код:
public class ApplicationUser : IdentityUser, IApplicationUser
{
[Display(Name = "Full name")]
public string FirstName { get; set; }
public string LastName { get; set; }
[NotMapped]
public string FullName => $"{FirstName} {LastName}";
}
И ConfigureService s метод из Startup.cs :
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(
Configuration.GetConnectionString("DefaultConnection")));
services.AddIdentity<IdentityUser, IdentityRole>()
.AddDefaultTokenProviders()
.AddEntityFrameworkStores<ApplicationDbContext>();
services.AddScoped<IUnitOfWork, UnitOfWork>();
services.AddSingleton<IEmailSender, EmailSender>();
services.AddMvc(options => options.EnableEndpointRouting = false)
.SetCompatibilityVersion(Microsoft.AspNetCore.Mvc.CompatibilityVersion.Version_3_0);
services.AddControllersWithViews();
services.AddRazorPages().AddRazorRuntimeCompilation();
}
@ Update Решение найдено. В методе ConfigureServices()
я исправил опечатку в соответствии с инструкциями mvermef. Это была большая помощь, правда. После этого я изменил в _LoginPartial.cs html следующее:
@inject SignInManager<IdentityUser> SignInManager
@inject UserManager<IdentityUser> UserManager
на:
@inject SignInManager<ApplicationUser> SignInManager
@inject UserManager<ApplicationUser> UserManager
В этот момент приложение работало, и я был возможность использовать UserManager<>
, как я хотел. Я быстро обнаружил, что пользователь не сможет зарегистрироваться или войти в систему. Решением было это изменение (с до:
private readonly UserManager<ApplicationUser> _userManager;
private readonly SignInManager<ApplicationUser> _signInManager;
Не забудьте также внести изменения в конструкторы. Я изменил каждый файл в Каталог областей (имя по умолчанию).