Не удалось разрешить службу для типа " Microsoft.AspNetCore.Тождественность.UserManager "при попытке активировать "AuthController"

Я получаю эту ошибку в контроллере входа в систему.

InvalidOperationException: не удалось разрешить службу для типа " Microsoft.AspNetCore.Тождественность.UserManager ' 1[Автомобиль.Модели.Account] 'при попытке активировать' автомобиль.Сервер.Контроллеры.AuthController'.

вот конструктор контроллера Auth:

private SignInManager<Automobile.Models.Account> _signManager;
    private UserManager<Automobile.Models.Account> _userManager;

    public AuthController(UserManager<Models.Account> userManager,
                          SignInManager<Automobile.Models.Account> signManager)
    {
        this._userManager = userManager;
        this._signManager = signManager;
    }

и вот ConfigureServices в запуске.cs:

public void ConfigureServices(IServiceCollection services)
    {
        // Add framework services.
        services.AddApplicationInsightsTelemetry(Configuration);
        services.Configure<AppConfig>(Configuration.GetSection("AppSettings"));

        //var provider = HttpContext.ApplicationServices;
        //var someService = provider.GetService(typeof(ISomeService));


        services.AddDbContext<Providers.Database.EFProvider.DataContext>(options => options
            .UseSqlServer(Configuration.GetConnectionString("DefaultConnection"),
                 b => b.MigrationsAssembly("Automobile.Server")
            ));


        services.AddIdentity<IdentityUser, IdentityRole>(options =>
        {
            options.User.RequireUniqueEmail = false;
        })
        .AddEntityFrameworkStores<Providers.Database.EFProvider.DataContext>()
        .AddDefaultTokenProviders(); 
        //services.AddScoped<SignInManager<Automobile.Models.Account>, SignInManager<Automobile.Models.Account>>();
        //services.AddScoped<UserManager<Automobile.Models.Account>, UserManager<Automobile.Models.Account>>();

        services.AddMvc();
        App.Service = services.BuildServiceProvider();

        // Adds a default in-memory implementation of IDistributedCache.
        services.AddDistributedMemoryCache();

        services.AddSession(options =>
        {
            // Set a short timeout for easy testing.
            options.IdleTimeout = TimeSpan.FromSeconds(10);
            options.CookieHttpOnly = true;
        });

    }

2 ответов


вам нужно использовать одну и ту же модель пользовательских данных в SignInManager, UserManager и services.Аддидентити. Тот же Принципал имеет значение, если используется собственный класс модели ролей пользовательского приложения.

изменить

services.AddIdentity<IdentityUser, IdentityRole>(options =>
    {
        options.User.RequireUniqueEmail = false;
    })
    .AddEntityFrameworkStores<Providers.Database.EFProvider.DataContext>()
    .AddDefaultTokenProviders();

to

services.AddIdentity<Automobile.Models.Account, IdentityRole>(options =>
    {
        options.User.RequireUniqueEmail = false;
    })
    .AddEntityFrameworkStores<Providers.Database.EFProvider.DataContext>()
    .AddDefaultTokenProviders();

просто чтобы прояснить ответ:

если вы используете класс ApplicationUser в автозагрузку.cs:services.AddIdentity<ApplicationUser, IdentityRole>()

тогда вы должны использовать тот же класс в своем контроллере при его инъекции:

public AccountController(UserManager<ApplicationUser> userManager)

если вы используете какой-то другой класс, например:

public AccountController(UserManager<IdentityUser> userManager)

затем вы получите эту ошибку:

InvalidOperationException: Unable to resolve service for type 'Microsoft.AspNetCore.Identity.UserManager`1[IdentityUser]'

потому что ты использовал ApplicationUser при запуске, а не IdentityUser так этот тип не зарегистрирован с системой впрыски.