로그인 컨트롤러에서이 오류가 발생합니다.
InvalidOperationException : ‘Automobile.Server.Controllers.AuthController’활성화를 시도하는 동안 ‘Microsoft.AspNetCore.Identity.UserManager`1 [Automobile.Models.Account]’유형에 대한 서비스를 확인할 수 없습니다.
다음은 인증 컨트롤러 생성자입니다.
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;
}
다음은 startup.cs의 ConfigureServices입니다.
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;
});
}
답변
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)
그러면이 오류가 발생합니다.
InvalidOperationException : ‘Microsoft.AspNetCore.Identity.UserManager`1 [IdentityUser]’유형에 대한 서비스를 확인할 수 없습니다.
ApplicationUser
시작에 사용 IdentityUser
했기 때문에이 유형은 주입 시스템에 등록되지 않았습니다.
답변
이것은 원본 게시물과 약간 관련이 없지만 Google이 여기로 가져 오기 때문에 …이 오류가 발생하고 다음을 사용하는 경우 :
services.AddIdentityCore<YourAppUser>()
그런 다음 https://github.com/aspnet/Identity/blob/feedcb5c53444f716ef5121d3add56e11c7b71e5/src/Identity/IdentityServiceCollectionExtensions.cs#L79AddIdentity
에서 찾을 수있는 항목 을 수동으로 등록해야합니다 .
services.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
답변
ConfigureServices에서 역할 관리자를 추가하는 것을 잊지 마십시오.
services.AddDefaultIdentity<IdentityUser>()
.AddRoles<IdentityRole>() // <--------
.AddDefaultUI(UIFramework.Bootstrap4)
.AddEntityFrameworkStores<ApplicationDbContext>();
답변
아래와 같이 Startup 클래스 내의 ConfigureServices에서 IdentityUser 및 IdentityRole을 개별적으로 설정할 수 있습니다.
services.AddDefaultIdentity<IdentityUser>()
.AddRoles<IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>();
또는
AddIdentity에 직접 구성 할 수 있습니다.
services.AddIdentity<IdentityUser, IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>();
답변
“IdentityServer”를 사용하는 경우 IdentityServer가 사용자를 인증하고 클라이언트에 권한을 부여합니다. 기본적으로 IdentityServer는 실제로 사용자 관리에 관한 것이 아닙니다. 그러나 asp.net Identity에 대한 일부 지원이 있습니다.
따라서 다음을 추가해야합니다.
services.AddIdentityServer()
.AddAspNetIdentity<ApplicationUser>();
답변
아래와 같이 Statup.cs 클래스를 업데이트해야합니다.
services.AddIdentity <ApplicationUser, IdentityRole> () .AddEntityFrameworkStores ();
여기 : ApplicationUser는 내 사용자 정의 모델 클래스입니다.