ASP. NET Core Как заставить UserManager работать в контроллере? - PullRequest
0 голосов
/ 04 марта 2020

Я хочу использовать 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;

Не забудьте также внести изменения в конструкторы. Я изменил каждый файл в Каталог областей (имя по умолчанию).

Ответы [ 2 ]

0 голосов
/ 04 марта 2020

Похоже, вы получили опечатку в вашем ConfigureServices()

services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(
            Configuration.GetConnectionString("DefaultConnection")));
    services.AddIdentity<ApplicationUser, IdentityRole>()   //<<<<<< You have IdentityUser
        .AddDefaultTokenProviders()
        .AddEntityFrameworkStores<ApplicationDbContext>();

Поскольку у вас есть IdentityUser вместо вашего производного типа, он выдаст ошибку ... Вам не нужно использовать AddScoped

0 голосов
/ 04 марта 2020

Добавьте это в метод ConfigureServices

services.AddScoped<UserManager<ApplicationUser>>();
...