Нет службы для типа "Microsoft.AspNetCore.Identity.RoleManager error - PullRequest
0 голосов
/ 06 февраля 2019

Я устанавливаю пользовательские роли в приложении ASP.NET CORE 2.1.Но когда я пытаюсь использовать RoleManager, он выдает ошибку.Я получаю сообщение об ошибке:

No service for type 'Microsoft.AspNetCore.Identity.RoleManager`1[Microsoft.AspNetCore.Identity.IdentityRole]' has been registered.)'

Я просмотрел все приложение, чтобы узнать, где еще находится IdentityUser, так как я создал класс, который наследует от него (ApplicationUser), но всеостальное кажется правильным.Добавление services.AddIdentity<ApplicationUser, IdentityRole>() .AddEntityFrameworkStores<ApplicationDbContext>() .AddDefaultTokenProviders(); дает ошибку времени выполнения, в которой говорится: NotSupportedException: Store does not implement IUserRoleStore<TUser>. Добавление Service.AddDefaultIdentity() вместо AddIdentity() также не работает.

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("ApplicationDBContextConnection")));


        //services.AddDefaultIdentity<ApplicationUser>().AddRoles<IdentityRole>().AddEntityFrameworkStores<ApplicationDBContext>();

        services.Configure<IdentityOptions>(options =>
        {
            // Password settings
            options.Password.RequireDigit = true;
            options.Password.RequiredLength = 8;
            options.Password.RequireNonAlphanumeric = false;
            options.Password.RequireUppercase = true;
            options.Password.RequireLowercase = false;
            options.Password.RequiredUniqueChars = 6;

            // Lockout settings
            options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(30);
            options.Lockout.MaxFailedAccessAttempts = 10;
            options.Lockout.AllowedForNewUsers = true;

            // User settings
            options.User.RequireUniqueEmail = true;
        });

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

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env, UserManager<ApplicationUser> userManager)
    {


        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Home/Error");
            app.UseHsts();
        }

        app.UseHttpsRedirection();
        app.UseStaticFiles();
        app.UseCookiePolicy();
        app.UseAuthentication();


        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");
        });

        CreateUserRoles(userManager).GetAwaiter().GetResult();
    }
    private async Task CreateUserRoles( UserManager<ApplicationUser> userManager)
    {

        var UserManager = userManager;

        //Assign Admin role to the main User here we have given our newly registered 
        //login id for Admin management
        ApplicationUser user = await UserManager.FindByEmailAsync("test@test.com");
        UserManager.AddToRoleAsync(user, "Admin").GetAwaiter().GetResult();
    }
}

Ответы [ 2 ]

0 голосов
/ 08 февраля 2019

Я понял это.

Я создал новый класс ApplicationUser, который унаследовал от него IdentityUser.После этого я запустил скаффолдер Identity, заявив, что мой ApplicationUser используется в качестве нового класса.

При этом .NET CORE создал дополнительный класс:

    public class IdentityHostingStartup : IHostingStartup
{
    public void Configure(IWebHostBuilder builder)
    {
        builder.ConfigureServices((context, services) => {
            services.AddDbContext<ApplicationDBContext>(options =>
                options.UseSqlServer(
                    context.Configuration.GetConnectionString("ApplicationDBContextConnection")));

            services.AddDefaultIdentity<ApplicationUser>()
                .AddEntityFrameworkStores<ApplicationDBContext>();
        });
    }
}

Конфигурация в этом классе переопределяет все опции и службы (которые были объявлены) в классе запуска.И он потерпит крах, если у вас будут идентичные опции / сервисы, объявленные в обоих классах. Вот почему это не работаетПосле добавления .AddRoles<IdentityRole>() в IdentityHostingStartUp все работает!

Я все еще ищу способ вырвать IdentityHostingStartUp, просто удаление тех, которые были там объявлены, приведет к сбою приложения.

0 голосов
/ 06 февраля 2019

Вы можете явно внедрить любую зарегистрированную службу в метод Configure().

public void Configure(RoleManager<IdentityRole> roleManager)

Я не уверен, что происходит, когда вы пытаетесь внедрить IServiceProvider, но это выглядит неправильно.

Кроме того, никогда не используйте .Wait(), вместо этого используйте .GetAwaiter().GetResult().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...