Quelle est la cause possible de cette erreur:
InvalidOperationException: aucun service pour le type "Microsoft.AspNetCore.Identity.UserManager [Microsoft.AspNetCore.Identity.IdentityUser]" n'a été enregistré.
Mon framework cible est netcoreapp2.1
.
Voici ma classe de magasin d'utilisateurs:
public class MyUserStore : IdentityUser
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
Et ma classe de rôle d'utilisateur:
public class MyUserRole : IdentityRole
{
public string Description { get; set; }
}
Mon DbContext:
public class ApplicationDbContext : IdentityDbContext<MyUserStore,MyUserRole,string>
{
public ApplicationDbContext(DbContextOptions<ApplicationDbContext>
options): base(options) { }
}
Ma méthode ConfigureServices
dans Startup.cs
:
public void ConfigureServices(IServiceCollection services)
{
services.Configure<CookiePolicyOptions>(options =>
{
// This lambda determines whether user consent for non-essential cookies is needed for a given request.
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
});
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
//services.AddDefaultIdentity<IdentityUser>()
// .AddEntityFrameworkStores<ApplicationDbContext>();
services.AddIdentity<MyUserStore, MyUserRole>(cfg => {
cfg.User.RequireUniqueEmail = true;
}).AddEntityFrameworkStores<ApplicationDbContext>();
services.AddTransient<Seeder>();
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}
je veux comprendre pourquoi cela se produit et quelle est la meilleure pratique.
Lorsque vous enregistrez votre propre MyUserStore
(le mauvais nom doit être MyUser) pour l'identité AspNetCore, le type UserManager <> sera enregistré dans ServiceCollection sous le nom UserManager<MyUserStore>
.
Chaque fois que vous voulez résoudre le UserManager<>
, Spécifiez le modèle d'utilisateur d'identité enregistré dans votre démarrage comme paramètre de type. Ce serait UserManager<MyUserStore>
Dans votre cas spécifique.
Lors de l'appel de GetRequiredService<UserManager<IdentityUser>>()
sur le fournisseur de services résultant, GetRequiredService<UserManager<IdentityUser>>()
lèvera l'exception ci-dessus.
Cela se produit généralement dans les vues de rasoir. Par exemple.
@inject Microsoft.AspNetCore.Identity.UserManager<Microsoft.AspNetCore.Identity.IdentityUser> userManager
Ou de même, lorsque vous l'appelez vous-même dans d'autres classes, comme cela peut être le cas dans votre service Seeder
. Ou d'autres parties de code. La pile d'appels de votre exception devrait vous donner une idée de l'endroit où cela se produit.
C'est la solution, en _LoginPartial.cshtml
, remplacer
@using Microsoft.AspNetCore.Identity
@inject SignInManager<ApplicationUser> SignInManager
@inject UserManager<ApplicationUser> UserManager
avec
@using Microsoft.AspNetCore.Identity
@inject SignInManager<MyUserStore> SignInManager
@inject UserManager<MyUserStore> UserManager
Remarquez la différence, IdentityUser vs MyUserStore
Eu le même problème avec le noyau 2. Un autre domaine où vous devez vérifier est le fichier _ManageNav.cshtml
. Essayez de mettre à jour la ligne
@inject SignInManager<IdentityUser> SignInManager
avec
@inject SignInManager<YOURCUSTOMMODEL> SignInManager