web-dev-qa-db-fra.com

ASP.NET Core 2 - Identité - Erreurs DI avec des rôles personnalisés

J'ai obtenu ce code dans mon Startup.cs:

 services.AddDbContext<ApplicationDbContext>(options =>
            options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

        services.AddIdentity<ApplicationUser, ApplicationRole>()
            .AddEntityFrameworkStores<ApplicationDbContext>()
            .AddDefaultTokenProviders();

Dans ce même fichier, j'ai également remplacé la service.UseIdentity() par app.UseAuthentication(); comme recommandé par MS dans la nouvelle version de ASP Core 2.

Mon contexte Db:

 public class ApplicationDbContext : IdentityDbContext<ApplicationUser, ApplicationRole, string>
{
    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
        : base(options)
    {
    }

    protected override void OnModelCreating(ModelBuilder builder)
    {
        base.OnModelCreating(builder);
        // Customize the ASP.NET Identity model and override the defaults if needed.
        // For example, you can rename the ASP.NET Identity table names and more.
        // Add your customizations after calling base.OnModelCreating(builder);
    }


    //public DbSet<ApplicationUser> ApplicationUser { get; set; }

    //public DbSet<ApplicationRole> ApplicationRole { get; set; }
}

Et ma classe de rôle personnalisée:

 public class ApplicationRole : IdentityRole
{
    public ApplicationRole() : base() { }

    public ApplicationRole(string roleName) : base(roleName) { }

    public bool IsDefault { get; set; }
}

Lors de l'exécution de l'application, j'ai obtenu une méthode d'assistance SeedDatabase qui s'exécute:

var roleManager = serviceProvider.GetService<RoleManager<ApplicationRole>>();

Tout fonctionnait bien, mais depuis la mise à jour de VS 2017 vers la dernière version et l'installation de .NET Core 2.0, cette dernière ligne de code lève maintenant l'exception suivante:

System.AggregateException occurred
HResult=0x80131500
Message=One or more errors occurred. (Cannot resolve scoped service 'Microsoft.AspNetCore.Identity.RoleManager`1[CspLicensingPortal.Models.ApplicationRole]' from root provider.)
Source=<Cannot evaluate the exception source>
StackTrace:
at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)
at System.Threading.Tasks.Task.Wait(Int32 millisecondsTimeout, CancellationToken cancellationToken)
at System.Threading.Tasks.Task.Wait()
at CspLicensingPortal.Startup.Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) in D:\gsandorx\Documents\Visual Studio 2017\Projects\CspLicensingPortal\CspLicensingPortal\Startup.cs:line 275

Inner Exception 1:
InvalidOperationException: Cannot resolve scoped service 'Microsoft.AspNetCore.Identity.RoleManager`1[MyApplication.Models.ApplicationRole]' from root provider.

Je ne sais pas pourquoi le gestionnaire de services DI n'est plus en mesure de trouver ma classe ApplicationRole. J'ai vérifié et toutes mes références utilisent cette classe et non le rôle d'identité par défaut.

Des idées?

17
Bmelca

Vous devez créer vous-même l'IServiceScope.

Pour ce faire, vous devez remplacer

var roleManager = serviceProvider.GetService<RoleManager<ApplicationRole>>();

avec

using (IServiceScope scope = app.ApplicationServices.CreateScope()) {
    RoleManager<IdentityRole> roleManager = scope.ServiceProvider.GetRequiredService<RoleManager<IdentityRole>>();

    // Seed database code goes here
}
24
Manos Pasgiannis