Recibo este error en el controlador de inicio de sesión.
InvalidOperationException: no se puede resolver el servicio para el tipo 'Microsoft.AspNetCore.Identity.UserManager`1 [Automobile.Models.Account]' al intentar activar 'Automobile.Server.Controllers.AuthController'.
aquí está el constructor 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;
}
y aquí está ConfigureServices en 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 clase de usuario básica pero luego está usandoAutomobile.Models.Account
, que, por supuesto, no está registrado en ninguna parte por ASP.NET IdentityRespuestas:
Debe utilizar el mismo modelo de datos de usuario en SignInManager, UserManager y services.AddIdentity. El mismo principio es cierto si está utilizando su propia clase de modelo de rol de aplicación personalizada.
Entonces, cambia
services.AddIdentity<IdentityUser, IdentityRole>(options => { options.User.RequireUniqueEmail = false; }) .AddEntityFrameworkStores<Providers.Database.EFProvider.DataContext>() .AddDefaultTokenProviders();
a
services.AddIdentity<Automobile.Models.Account, IdentityRole>(options => { options.User.RequireUniqueEmail = false; }) .AddEntityFrameworkStores<Providers.Database.EFProvider.DataContext>() .AddDefaultTokenProviders();
fuente
Solo para tener clara la respuesta:
Si usa la clase
ApplicationUser
en startup.cs:services.AddIdentity<ApplicationUser, IdentityRole>()
entonces debes usar la misma clase en tu controlador al inyectarlo:
public AccountController(UserManager<ApplicationUser> userManager)
Si usa alguna otra clase como:
public AccountController(UserManager<IdentityUser> userManager)
entonces obtendrás este error:
debido a que usó
ApplicationUser
en el inicio, noIdentityUser
así este tipo no está registrado con el sistema de inyección.fuente
Esto no tiene nada que ver con la publicación original, pero como Google lo trae aquí ... si está recibiendo este error y está usando:
Luego, deberá registrar manualmente las cosas que lo
AddIdentity
hacen, que se pueden encontrar aquí: 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>>();
Deberá reemplazar
TUser
yTRole
con sus implementaciones de esos, o el predeterminadoIdentityUser
,IdentityRole
fuente
AddIdentity
yAddJwtBearer
fue configurar las tres opciones que se muestran en el ejemplo; solo lo había estado usandoDefaultAuthenticationScheme
. Todavía obtengo la cookie al iniciar sesión, pero[Authorize]
ahora funciona para los tokens JWT sin especificar un AuthenticationSchema.no olvide agregar el administrador de roles en ConfigureServices
services.AddDefaultIdentity<IdentityUser>() .AddRoles<IdentityRole>() // <-------- .AddDefaultUI(UIFramework.Bootstrap4) .AddEntityFrameworkStores<ApplicationDbContext>();
fuente
Puede configurar IdentityUser e IdentityRole en ConfigureServices dentro de la clase Startup individualmente como se muestra a continuación:
O
puede configurar directamente en AddIdentity:
fuente
Si está utilizando "IdentityServer", entonces IdentityServer autentica al usuario y autoriza al cliente. De forma predeterminada, IdentityServer no se trata de administración de usuarios. Pero hay algo de soporte para asp.net Identity
Entonces necesitas agregar:
fuente
Necesita actualizar su clase Statup.cs a continuación
services.AddIdentity <ApplicationUser, IdentityRole> () .AddEntityFrameworkStores ();
Aquí: ApplicationUser es mi clase de modelo personalizado.
fuente