Как создать «RoleManager <IdentityRole>» в ASP.Net Core? - PullRequest
0 голосов
/ 30 декабря 2018

Я не могу использовать RoleManager в своем приложении.Я пытаюсь внедрить пользователя с правами администратора в веб-приложение .NET Core и хочу, чтобы у этого пользователя была роль canEdit.То, что я получил в настоящее время, выдает эту ошибку:

System.InvalidOperationException: «Нет службы для типа» Microsoft.AspNetCore.Identity.RoleManager`1 [Microsoft.AspNetCore.Identity.IdentityRole] 'зарегистрирован.'

Я пробовал разные способы сделать это.Я пытался использовать Service Provider для этого, внедрения зависимостей и т. Д., Но все они выдают одну и ту же ошибку.

ServiceProvider в методе Configure Startup.cs:

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

var scopeFactory = app.ApplicationServices.GetRequiredService<IServiceScopeFactory>();
var scope = scopeFactory.CreateScope();
var roleManager = scope.ServiceProvider.GetRequiredService<RoleManager<IdentityRole>>();
DbInitializer dbi = new DbInitializer(roleManager);
dbi.Initialize(context, userManager);

Класс DBInitializer:

Конструктор:

private readonly RoleManager<IdentityRole> rm;

    public DbInitializer(RoleManager<IdentityRole> rm)
    {
        this.rm = rm;
    }

Метод CreateAdmin:

private async Task CreateAdmin(UserManager<ApplicationUser> userManager, ApplicationDbContext context)
    {
        IdentityResult ir;
        ir = await rm.CreateAsync(new IdentityRole("canEdit"));
        IdentityRole canEdit = new IdentityRole("canEdit");
        ApplicationUser admin = new ApplicationUser
        {
            UserName = "Member1@email.com"
        };
        if (context.Users.Where(u => u.UserName == admin.UserName).Count() == 0)
        {
            userManager.CreateAsync(admin, "Password123!").Wait();
            userManager.AddToRoleAsync(admin, "canEdit").Wait();
        }
    }

Метод CreateUsers:

private void CreateUsers(UserManager<ApplicationUser> userManager, ApplicationDbContext context)
    {

        CreateAdmin(userManager, context).Wait();

        ApplicationUser customer1 = new ApplicationUser
        {
            UserName = "Customer1@email.com"
        };
        if (context.Users.Where(u => u.UserName == customer1.UserName).Count() > 0)
        {
            userManager.CreateAsync(customer1, "Password123!").Wait();
        }

Это повторяется для customer2, 3, 45. Я могу оптимизировать это, избавившись от необходимости создавать объект, который мне может не понадобиться (в случае, если электронная почта существует), но я пытался быстро подобрать этот метод и метод CreateAdmin, а затем оптимизировать позже.К сожалению, я столкнулся с ошибкой, которую я не смог исправить.

Конечная цель состоит в том, чтобы класс DbInitializer заполнил 5 обычных пользователей и 1 администратора с дополнительными разрешениями / утверждениями.

1 Ответ

0 голосов
/ 31 декабря 2018

Зарегистрированы ли у вас службы идентификации?Кроме того, я столкнулся с проблемами, когда использовал .Wait () вместо await.

  services.AddIdentity<ApplicationUser,IdentityRole>(options=>
        {
            options.User.RequireUniqueEmail = true;               
            options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(5);
            options.Password.RequireNonAlphanumeric = false;
            options.Password.RequireUppercase = false;      

        })
            .AddDefaultTokenProviders()
            .AddDefaultUI()
            .AddRoles<IdentityRole>()
            .AddEntityFrameworkStores<ApplicationDbContext>();
        services.AddAuthorization();
        services.AddAuthentication();
        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1); 

Если это поможет, вот как я посеял свою базу данных.

  public SeedDataBase(IServiceProvider _serviceProvider, ApplicationDbContext _context)
    {
        serviceProvider = _serviceProvider;
        context = _context;

    }
    private IServiceProvider serviceProvider;
    private ApplicationDbContext context;
    private ApplicationUser superUser;

    public async Task Seed()
    {

        await CreateSuperUser();
        await SeedDb();
    }
    private async Task CreateSuperUser()
    {
        var _userManager = serviceProvider.GetRequiredService<UserManager<ApplicationUser>>();
        var userExists = await _userManager.GetUsersInRoleAsync("FULLADMIN");

        if (userExists.Count() < 1)
        {
            var _roleManager = serviceProvider.GetRequiredService<RoleManager<IdentityRole>>();
            var _signinManger = serviceProvider.GetRequiredService<SignInManager<ApplicationUser>>();

            superUser = new ApplicationUser()
            {
                UserName = "superuser@superuser.com",
                Email = "superuser@superuser.com",
                FirstName = "Super",
                LastName = "User",
                AccountCreationDate = DateTime.Now.ToShortDateString(),
                Access = ApplicationUser.Permissions.FullAdmin
            };
            var permissions = Enum.GetNames(typeof(ApplicationUser.Permissions));

            foreach (var s in permissions)
            {
                await _roleManager.CreateAsync(new IdentityRole(s));
            }
            await _userManager.CreateAsync(superUser, "SecureP@ssword1234");
            await _userManager.AddToRoleAsync(superUser, Enum.GetName(typeof(ApplicationUser.Permissions), superUser.Access));
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...