Я получаю эту ошибку в контроллере входа.
InvalidOperationException: не удалось разрешить службу для типа «Microsoft.AspNetCore.Identity.UserManager`1 [Automobile.Models.Account]» при попытке активировать «Automobile.Server.Controllers.AuthController».
вот конструктор Auth Controller:
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 в startup.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;
});
}
IdentityUser
как базовый пользовательский класс, но затем используетеAutomobile.Models.Account
, который, конечно же, нигде не регистрируется ASP.NET IdentityОтветы:
Вам необходимо использовать одну и ту же модель пользовательских данных в SignInManager, UserManager и services.AddIdentity. Тот же принцип справедлив, если вы используете свой собственный класс ролевой модели приложения.
Итак, меняем
services.AddIdentity<IdentityUser, IdentityRole>(options => { options.User.RequireUniqueEmail = false; }) .AddEntityFrameworkStores<Providers.Database.EFProvider.DataContext>() .AddDefaultTokenProviders();
к
services.AddIdentity<Automobile.Models.Account, IdentityRole>(options => { options.User.RequireUniqueEmail = false; }) .AddEntityFrameworkStores<Providers.Database.EFProvider.DataContext>() .AddDefaultTokenProviders();
источник
Просто чтобы прояснить ответ:
Если вы используете класс
ApplicationUser
в startup.cs:services.AddIdentity<ApplicationUser, IdentityRole>()
тогда вы должны использовать тот же класс в своем контроллере при его введении:
public AccountController(UserManager<ApplicationUser> userManager)
Если вы используете какой-то другой класс, например:
public AccountController(UserManager<IdentityUser> userManager)
тогда вы получите эту ошибку:
потому что вы использовали
ApplicationUser
в автозагрузке, неIdentityUser
значит, что этот тип не зарегистрирован в системе впрыска.источник
Это немного не связано с исходным сообщением, но поскольку Google приводит вас сюда ... если вы получаете эту ошибку и используете:
Затем вам нужно будет вручную зарегистрировать то, что
AddIdentity
делает, что можно найти здесь: https://github.com/aspnet/Identity/blob/feedcb5c53444f716ef5121d3add56e11c7b71e5/src/Identity/IdentityServiceCollectionExtensions.cs#L79services.AddHttpContextAccessor(); // Identity services services.TryAddScoped<IUserValidator<TUser>, UserValidator<TUser>>(); services.TryAddScoped<IPasswordValidator<TUser>, PasswordValidator<TUser>>(); services.TryAddScoped<IPasswordHasher<TUser>, PasswordHasher<TUser>>(); services.TryAddScoped<ILookupNormalizer, UpperInvariantLookupNormalizer>(); services.TryAddScoped<IRoleValidator<TRole>, RoleValidator<TRole>>(); // No interface for the error describer so we can add errors without rev'ing the interface services.TryAddScoped<IdentityErrorDescriber>(); services.TryAddScoped<ISecurityStampValidator, SecurityStampValidator<TUser>>(); services.TryAddScoped<ITwoFactorSecurityStampValidator, TwoFactorSecurityStampValidator<TUser>>(); services.TryAddScoped<IUserClaimsPrincipalFactory<TUser>, UserClaimsPrincipalFactory<TUser, TRole>>(); services.TryAddScoped<UserManager<TUser>>(); services.TryAddScoped<SignInManager<TUser>>(); services.TryAddScoped<RoleManager<TRole>>();
Вам нужно будет заменить
TUser
иTRole
своими реализациями тех или по умолчаниюIdentityUser
,IdentityRole
источник
AddIdentity
иAddJwtBearer
установки всех трех параметров, показанных в примере; я только использовалDefaultAuthenticationScheme
. Я все еще получаю cookie обратно при входе в систему, но[Authorize]
теперь работает для токенов JWT без указания AuthenticationSchema.не забудьте добавить диспетчер ролей в ConfigureServices
services.AddDefaultIdentity<IdentityUser>() .AddRoles<IdentityRole>() // <-------- .AddDefaultUI(UIFramework.Bootstrap4) .AddEntityFrameworkStores<ApplicationDbContext>();
источник
Вы можете установить IdentityUser и IdentityRole в ConfigureServices внутри класса Startup по отдельности, как показано ниже:
ИЛИ
вы можете настроить прямо в AddIdentity:
источник
Если вы используете «IdentityServer», тогда IdentityServer аутентифицирует пользователя и авторизует клиента. По умолчанию IdentityServer фактически не предназначен для управления пользователями. Но есть некоторая поддержка asp.net Identity
Итак, вам нужно добавить:
источник
Вам необходимо обновить свой класс Statup.cs следующим образом:
services.AddIdentity <ApplicationUser, IdentityRole> () .AddEntityFrameworkStores ();
Здесь: ApplicationUser - это мой собственный класс модели.
источник