Estou recebendo este erro no Login Controller.
InvalidOperationException: Não foi possível resolver o serviço para o tipo 'Microsoft.AspNetCore.Identity.UserManager`1 [Automobile.Models.Account]' ao tentar ativar 'Automobile.Server.Controllers.AuthController'.
aqui está o construtor 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;
}
e aqui está ConfigureServices em 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
como uma classe de usuário básica, mas está usandoAutomobile.Models.Account
, o que, é claro, não está registrado em nenhum lugar pelo ASP.NET IdentityRespostas:
Você precisa usar o mesmo modelo de dados do usuário em SignInManager, UserManager e services.AddIdentity. O mesmo princípio é verdadeiro se você estiver usando sua própria classe de modelo de função de aplicativo personalizado.
Então mude
services.AddIdentity<IdentityUser, IdentityRole>(options => { options.User.RequireUniqueEmail = false; }) .AddEntityFrameworkStores<Providers.Database.EFProvider.DataContext>() .AddDefaultTokenProviders();
para
services.AddIdentity<Automobile.Models.Account, IdentityRole>(options => { options.User.RequireUniqueEmail = false; }) .AddEntityFrameworkStores<Providers.Database.EFProvider.DataContext>() .AddDefaultTokenProviders();
fonte
Só para esclarecer a resposta:
Se você usar a classe
ApplicationUser
em startup.cs:services.AddIdentity<ApplicationUser, IdentityRole>()
então você deve usar a mesma classe em seu controlador ao injetá-lo:
public AccountController(UserManager<ApplicationUser> userManager)
Se você usar alguma outra classe, como:
public AccountController(UserManager<IdentityUser> userManager)
então você obterá este erro:
porque vc usou
ApplicationUser
na inicialização, nãoIdentityUser
so esse tipo não é cadastrado com o sistema de injeção.fonte
Isso não tem relação com a postagem original, mas como o Google traz você aqui ... se você está recebendo este erro e está usando:
Em seguida, você precisará registrar manualmente o que
AddIdentity
faz, que pode ser encontrado aqui: 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>>();
Você precisará substituir
TUser
eTRole
por suas implementações daqueles, ou o padrãoIdentityUser
,IdentityRole
fonte
AddIdentity
eAddJwtBearer
definir todas as três opções mostradas no exemplo; eu só estava usandoDefaultAuthenticationScheme
. Ainda recebo o cookie de volta no login, mas[Authorize]
agora funciona para os tokens JWT sem especificar um AuthenticationSchema.TryAddScoped<UserManager<TUser>>();
eservices.TryAddScoped<SignInManager<TUser>>();
ao meu Startup.cs corrigiu meu problema.não se esqueça de adicionar gerenciador de funções em ConfigureServices
services.AddDefaultIdentity<IdentityUser>() .AddRoles<IdentityRole>() // <-------- .AddDefaultUI(UIFramework.Bootstrap4) .AddEntityFrameworkStores<ApplicationDbContext>();
fonte
Você pode definir IdentityUser e IdentityRole em ConfigureServices dentro da classe Startup individualmente, conforme mostrado abaixo:
OU
você pode configurar diretamente em AddIdentity:
fonte
Se você estiver usando "IdentityServer", então IdentityServer autentica o usuário e autoriza o cliente. Por padrão, IdentityServer não trata de gerenciamento de usuários. Mas há algum suporte para identidade asp.net
Então você precisa adicionar:
fonte
Você precisa atualizar sua classe Statup.cs com abaixo
services.AddIdentity <ApplicationUser, IdentityRole> () .AddEntityFrameworkStores ();
Aqui: ApplicationUser é minha classe de modelo personalizado.
fonte