7

У меня есть приложение ASP.NET Core, которое использует Identity. Он работает, но когда я пытаюсь добавить пользовательские роли в базу данных, я сталкиваюсь с проблемами.Идентификатор ядра ASP.NET: нет службы для диспетчера ролей

В Startup ConfigureServices я добавил Идентичность и диспетчер ролей как контекстными службы, как это:

services.AddIdentity<Entities.DB.User, IdentityRole<int>>() 
       .AddEntityFrameworkStores<MyDBContext, int>(); 

services.AddScoped<RoleManager<IdentityRole>>(); 

и в запуске Configure я впрыснуть RoleManager и передать его в мой пользовательский класс RolesData:

public void Configure(
     IApplicationBuilder app, 
     IHostingEnvironment env, 
     ILoggerFactory loggerFactory, 
     RoleManager<IdentityRole> roleManager 
    ) 
    { 

    app.UseIdentity(); 
    RolesData.SeedRoles(roleManager).Wait(); 
    app.UseMvc(); 

Это RolesData класс:

public static class RolesData 
{ 

    private static readonly string[] roles = new[] { 
     "role1", 
     "role2", 
     "role3" 
    }; 

    public static async Task SeedRoles(RoleManager<IdentityRole> roleManager) 
    { 

     foreach (var role in roles) 
     { 

      if (!await roleManager.RoleExistsAsync(role)) 
      { 
       var create = await roleManager.CreateAsync(new IdentityRole(role)); 

       if (!create.Succeeded) 
       { 

        throw new Exception("Failed to create role"); 

       } 
      } 

     } 

    } 

} 

приложение строит без ошибок, но при попытке открыть его, я получаю следующее сообщение об ошибке:

Unable to resolve service for type 'Microsoft.AspNetCore.Identity.IRoleStore`1[Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityRole]' while attempting to activate 'Microsoft.AspNetCore.Identity.RoleManager

Что я делаю неправильно? Моя кишка говорит, что что-то не так с тем, как я добавляю RoleManager в качестве службы.

PS: Я использовал «Нет аутентификации» при создании проекта, чтобы узнать Identity с нуля.

+0

Я предлагаю создать другой проект с использованием отдельных учетных записей пользователей, чтобы вы могли сравнить с тем, что настроено для вас, когда вы используете шаблон, который включает в себя идентификатор. –

+0

Новый проект с добавленными «отдельными учетными записями пользователей» не содержит кода, который настраивается роли. –

+0

Нет, это не так, но у него может быть какой-то код, который вызывает зависимые связи, которые вы неправильно подключили. –

ответ

7

What am I doing wrong? My gut says there's something wrong with how I add the RoleManager as a service.

регистрации часть на самом деле хорошо, помысел вы должны удалить services.AddScoped<RoleManager<IdentityRole>>(), как менеджер роли уже добавлен для вас services.AddIdentity().

Ваш вопрос, скорее всего, вызвано родовое несоответствие типов: в то время как вы называете services.AddIdentity() с IdentityRole<int>, вы пытаетесь решить RoleManager с IdentityRole, который является эквивалентом IdentityRole<string> (string является типом ключа по умолчанию в ASP.NET ядро ​​идентичности).

Обновите свой Configure метод, чтобы принять параметр RoleManager<IdentityRole<int>>, и он должен работать.

+0

Да! Спасибо, сэр! Теперь он работает нормально. –

+0

Это было отличное решение и очень полезно. Я также рекомендую вызывать SeedRoles из DatabaseInitializer, чтобы создатели CreateUsers и роли async запускали что-то вроде 'code' public async Task SeedAsync() {ждали CreateUsersAsync(); ждать RolesData.SeedRoles (_roleManager);} – RussHooker

Смежные вопросы