Не удалось разрешить службу для типа " 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
так этот тип не зарегистрирован с системой впрыски.