3
votes

Comment inscrire RoleManager dans Startup.cs dans ASP.NET Core

Lorsque j'exécute mon application en mode débogage, ma méthode d'amorçage échoue à cause d'un service "manquant". Le message d'erreur est:

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

Quelqu'un peut-il m'aider à enregistrer correctement ce service dans la classe StartUp.cs ? Merci!

RolesConfig.cs

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    // This method gets called by the runtime. Use this method to add services to the container.
    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.AddHttpClient();
        services.AddHttpClient<IExceptionServiceClient, ExceptionServiceClient>();

        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
    }

Startup.cs

public static class RolesConfig
{

    public static async Task InitialiseAsync(ApplicationDbContext context, IServiceProvider serviceProvider)
    {
        var roleManager = serviceProvider.GetRequiredService<RoleManager<IdentityRole>>();
        string[] roleNames = {"Admin", "Report", "Search"};
        foreach (var roleName in roleNames)
        {
            var roleExist = await roleManager.RoleExistsAsync(roleName);
            if (!roleExist)
                await roleManager.CreateAsync(new IdentityRole(roleName));
        }
    }
}


4 commentaires

Où est votre méthode ConfigureServices ? En supposant que vous utilisez ASP.NET Core Identity, appelez-vous services.AddDefaultIdentity () n'importe où?


Vérifiez ceci: ASP.NET Core Identity: aucun service pour le gestionnaire de rôles


Cette question est sans réponse sans voir comment vous avez configuré vos services. En général, si vous obtenez une exception liée au service, c'est le premier endroit à rechercher.


@ChrisPratt J'ai ajouté Startup.cs maintenant


3 Réponses :


4
votes

Vous devrez probablement ajouter

services.AddIdentity<IdentityUser, IdentityRole>(config =>
{
        config.Password.RequireNonAlphanumeric = false; //optional
        config.SignIn.RequireConfirmedEmail = true; //optional
})
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();

dans votre méthode ConfigureServices dans Startup.cs


1 commentaires

cela marche! Merci beaucoup. Pour toute autre personne utilisant cette réponse, n'oubliez pas de supprimer services.AddDefaultIdentity<>



2
votes

Dans votre méthode ConfigureServices , vous appelez déjà AddDefaultIdentity qui est un nouvel ajout dans la version 2.1 qui structure Identity sans prise en charge des rôles. Pour ajouter la prise en charge des rôles et donc le RoleManager à votre collection de services, modifiez votre code comme ci-dessous:

services.AddDefaultIdentity<IdentityUser>()
  .AddEntityFrameworkStores<ApplicationDbContext>()
  .AddRoles<IdentityRole>();


1 commentaires

Avec cette méthode, cette erreur a été générée InvalidOperationException: Impossible de résoudre le service pour le type «Microsoft.AspNetCore.Identity.IRoleStore1 [Microsoft.AspNetC‌ ore.Identity.Identit‌ yRole]» lors de la tentative d'activation de «Microsoft.AspNetCore. Identity.RoleManager1 [Microsoft.AspNet‌ Core.Identity.Identi‌ tyRole] '.



3
votes

Je pense que vous manquez l'appel AddRoleManager. Voici une configuration similaire que j'avais, essayez:

        services.AddIdentity<IdentityUser, IdentityRole>(o => {
            o.Password.RequiredLength = 8;
        })
        .AddRoles<IdentityRole>()
        .AddRoleManager<RoleManager<IdentityRole>>()
        .AddDefaultTokenProviders()
        .AddEntityFrameworkStores<ApplicationDbContext>();


0 commentaires