Как создавать роли в ASP.NET Core 2.2 и назначать их пользователям - PullRequest
0 голосов
/ 05 мая 2019

Я использую шаблон сайта asp.net core 2.2 по умолчанию и аутентификацию, выбранную в качестве отдельной учетной записи пользователя. Как я могу создать роль «Администратор» и назначить ее пользователю, чтобы я мог использовать роль в контроллере для фильтрации доступа и позволить им видеть разные страницы. Вот что я нашел в интернете до сих пор, но он не работает, потому что он говорит: ApplicationUser could not be found

private void CreateRoles(IServiceProvider serviceProvider)
        {

            var roleManager = serviceProvider.GetRequiredService<RoleManager<IdentityRole>>();
            var userManager = serviceProvider.GetRequiredService<UserManager<ApplicationUser>>();
            Task<IdentityResult> roleResult;
            string email = "someone@somewhere.com";

            //Check that there is an Administrator role and create if not
            Task<bool> hasAdminRole = roleManager.RoleExistsAsync("Administrator");
            hasAdminRole.Wait();

            if (!hasAdminRole.Result)
            {
                roleResult = roleManager.CreateAsync(new IdentityRole("Administrator"));
                roleResult.Wait();
            }

            //Check if the admin user exists and create it if not
            //Add to the Administrator role

            Task<ApplicationUser> testUser = userManager.FindByEmailAsync(email);
            testUser.Wait();

            if (testUser.Result == null)
            {
                ApplicationUser administrator = new ApplicationUser();
                administrator.Email = email;
                administrator.UserName = email;

                Task<IdentityResult> newUser = userManager.CreateAsync(administrator, "_AStrongP@ssword!");
                newUser.Wait();

                if (newUser.Result.Succeeded)
                {
                    Task<IdentityResult> newUserRole = userManager.AddToRoleAsync(administrator, "Administrator");
                    newUserRole.Wait();
                }
            }

        }

Буду весьма признателен за помощь в создании администратора для моего приложения.

Ответы [ 2 ]

1 голос
/ 06 мая 2019

Первый шаг - создать класс ApplicationUser, который можно использовать для расширения утверждений:

public class ApplicationUser : IdentityUser
{

}

Измените _LoginPartial.cshtml, чтобы использовать этот класс:

@inject SignInManager<ApplicationUser> SignInManager
@inject UserManager<ApplicationUser> UserManager

Измените папку ApplicationDbContext.cs в Data, чтобы назначить ApplicationUser и IdentityRole:

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

Измените Startup.cs, чтобы включить использование нового ApplicationUser и управление ролями:

services.AddDefaultIdentity<ApplicationUser>()
    .AddRoles<IdentityRole>()
    .AddDefaultUI(UIFramework.Bootstrap4)
    .AddEntityFrameworkStores<ApplicationDbContext>();

После этого вы можете начать сеять роль и назначить пользователю, например:

private async Task CreateUserRoles(IServiceProvider serviceProvider)
{
    var RoleManager = serviceProvider.GetRequiredService<RoleManager<IdentityRole>>();
    var UserManager = serviceProvider.GetRequiredService<UserManager<ApplicationUser>>();

    IdentityResult roleResult;
    //Adding Admin Role
    var roleCheck = await RoleManager.RoleExistsAsync("Admin");
    if (!roleCheck)
    {
        //create the roles and seed them to the database
        roleResult = await RoleManager.CreateAsync(new IdentityRole("Admin"));
    }
    //Assign Admin role to the main User here we have given our newly registered 
    //login id for Admin management
    ApplicationUser user = await UserManager.FindByEmailAsync("v-nany@hotmail.com");
    await UserManager.AddToRoleAsync(user, "Admin");
}

Для использования:

public void Configure(IApplicationBuilder app, IHostingEnvironment env,IServiceProvider serviceProvider)
{
    .......

    app.UseAuthentication();

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

    CreateUserRoles(serviceProvider).Wait();
}
0 голосов
/ 06 мая 2019

Вам необходимо добавить класс ApplicationUser, который также наследует класс IdentityUser.

 public class ApplicationUser : IdentityUser
    {
    }
...