Este dilema se puede resolver de diversas formas, por lo tanto te enseñamos la solución más completa para nosotros.
Solución:
Debe usar el mismo modelo de datos de usuario en SignInManager, UserManager y services.AddIdentity. El mismo director es true si está utilizando su propia clase de modelo de rol de aplicación personalizada.
Entonces, cambia
services.AddIdentity(options =>
options.User.RequireUniqueEmail = false;
)
.AddEntityFrameworkStores()
.AddDefaultTokenProviders();
a
services.AddIdentity(options =>
options.User.RequireUniqueEmail = false;
)
.AddEntityFrameworkStores()
.AddDefaultTokenProviders();
Para que quede claro la respuesta:
Si usas la clase ApplicationUser
en inicio.cs: services.AddIdentity
entonces debe usar la misma clase en su controlador al inyectarlo:
public AccountController(UserManager userManager)
Si usa alguna otra clase como:
public AccountController(UserManager userManager)
entonces obtendrá este error:
InvalidOperationException: no se puede servicio de resolución para el tipo ‘Microsoft.AspNetCore.Identity.UserManager`1[IdentityUser]’
porque usaste ApplicationUser
en el arranque, no IdentityUser
por lo que este tipo no está registrado con el sistema de inyección.
Esto no tiene nada que ver con la publicación original, pero dado que Google te trae aquí… si recibes este error y estás usando:
services.AddIdentityCore()
Luego deberá registrar manualmente las cosas que AddIdentity
hace, que se puede encontrar aquí: https://github.com/aspnet/Identity/blob/feedcb5c53444f716ef5121d3add56e11c7b71e5/src/Identity/IdentityServiceCollectionExtensions.cs#L79
services.AddHttpContextAccessor();
// Identity services
services.TryAddScoped, UserValidator>();
services.TryAddScoped, PasswordValidator>();
services.TryAddScoped, PasswordHasher>();
services.TryAddScoped();
services.TryAddScoped, RoleValidator>();
// No interface for the error describer so we can add errors without rev'ing the interface
services.TryAddScoped();
services.TryAddScoped>();
services.TryAddScoped>();
services.TryAddScoped, UserClaimsPrincipalFactory>();
services.TryAddScoped>();
services.TryAddScoped>();
services.TryAddScoped>();
Tendrás que reemplazar TUser
y TRole
con sus implementaciones de esos, o el valor predeterminado IdentityUser
, IdentityRole