web-dev-qa-db-fra.com

Aucun service pour le type «Microsoft.AspNetCore.Identity.UserManager`1 [Microsoft.AspNetCore.Identity.IdentityUser]» n'a été enregistré

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.

8
David Zagi

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.

7
InDieTasten

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

5
Olawale david

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
1
Tesfaye