Как создать роль в asp.net ядро и назначить их пользователям

Я использую asp.net ядро по умолчанию веб-сайтов и проверки подлинности, выбранного в качестве индивидуального счета пользователя. Как я могу создать роль и присвоить ее пользователей, так что я могу использовать в роли контроллера для фильтрации доступа.

Комментарии к вопросу (1)

Мой комментарий был удален, потому что я дал ссылку на подобный вопрос я ответил Здесь. Эрго, я'будете ответить на него более описательно это время. Здесь идет.

Вы можете сделать это легко, создав метод CreateRoles в старте класса. Это помогает проверить, если создал роли, и создает роли, если они не'т; о запуска приложения. Как так.

private async Task CreateRoles(IServiceProvider serviceProvider)
    {
        //initializing custom roles 
        var RoleManager = serviceProvider.GetRequiredService();
        var UserManager = serviceProvider.GetRequiredService();
        string[] roleNames = { "Admin", "Manager", "Member" };
        IdentityResult roleResult;

        foreach (var roleName in roleNames)
        {
            var roleExist = await RoleManager.RoleExistsAsync(roleName);
            if (!roleExist)
            {
                //create the roles and seed them to the database: Question 1
                roleResult = await RoleManager.CreateAsync(new IdentityRole(roleName));
            }
        }

        //Here you could create a super user who will maintain the web app
        var poweruser = new ApplicationUser
        {

            UserName = Configuration["AppSettings:UserName"],
            Email = Configuration["AppSettings:UserEmail"],
        };
    //Ensure you have these values in your appsettings.json file
        string userPWD = Configuration["AppSettings:UserPassword"];
        var _user = await UserManager.FindByEmailAsync(Configuration["AppSettings:AdminUserEmail"]);

       if(_user == null)
       {
            var createPowerUser = await UserManager.CreateAsync(poweruser, userPWD);
            if (createPowerUser.Succeeded)
            {
                //here we tie the new user to the role
                await UserManager.AddToRoleAsync(poweruser, "Admin");

            }
       }
    }

и тогда вы могли бы назвать CreateRoles(поставщику услуги).Ждать(); способ от способ "настроить" в классе автозагрузки. убедитесь, что вы метод iserviceprovider в качестве параметра "настроить" класса.

Используя авторизации на основе ролей в контроллер для фильтрации доступа пользователей: Вопрос 2

Вы можете сделать это легко, вот так.

[Authorize(Roles="Manager")]
public class ManageController : Controller
{
   //....
}

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

[Authorize(Roles="Admin, Manager")]
public IActionResult Index()
{
/*
 .....
 */ 
}

Хотя это прекрасно работает, гораздо лучше на практике, вы можете прочитать об использовании политика, основанная роль чеки. Вы можете найти его на базовую документацию ASP.NET здесь, или в этой статье я об этом писал здесь

Комментарии (7)
Решение

Я создал действий в контроллере внимание, что вызов функции для создания ролей и влияют на роль администратора пользователей по умолчанию (вы, вероятно, следует удалить пользователя по умолчанию в производстве):

    private async Task createRolesandUsers()
    {  
        bool x = await _roleManager.RoleExistsAsync("Admin");
        if (!x)
        {
            // first we create Admin rool    
            var role = new IdentityRole();
            role.Name = "Admin";
            await _roleManager.CreateAsync(role);

            //Here we create a Admin super user who will maintain the website                   

            var user = new ApplicationUser();
            user.UserName = "default";
            user.Email = "default@default.com";

            string userPWD = "somepassword";

            IdentityResult chkUser = await _userManager.CreateAsync(user, userPWD);

            //Add default User to Role Admin    
            if (chkUser.Succeeded)
            {
                var result1 = await _userManager.AddToRoleAsync(user, "Admin");
            }
        }

        // creating Creating Manager role     
        x = await _roleManager.RoleExistsAsync("Manager");
        if (!x)
        {
            var role = new IdentityRole();
            role.Name = "Manager";
            await _roleManager.CreateAsync(role);
        }

        // creating Creating Employee role     
        x = await _roleManager.RoleExistsAsync("Employee");
        if (!x)
        {
            var role = new IdentityRole();
            role.Name = "Employee";
            await _roleManager.CreateAsync(role);
        }
  }

После вы можете создать контроллер для управления ролями пользователей.

Комментарии (6)

Тэми'ы ответ почти правильный, но вы не можете вызвать асинхронную функцию от номера асинхронная функция, как он считает. Что вам нужно сделать, это сделать асинхронные вызовы в синхронной функции вот так :

    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, IServiceProvider serviceProvider)
    {
        loggerFactory.AddConsole(Configuration.GetSection("Logging"));
        loggerFactory.AddDebug();

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

        app.UseStaticFiles();

        app.UseIdentity();

        // Add external authentication middleware below. To configure them please see https://go.microsoft.com/fwlink/?LinkID=532715

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

        CreateRoles(serviceProvider);

    }

    private void CreateRoles(IServiceProvider serviceProvider)
    {

        var roleManager = serviceProvider.GetRequiredService();
        var userManager = serviceProvider.GetRequiredService();
        Task roleResult;
        string email = "someone@somewhere.com";

        //Check that there is an Administrator role and create if not
        Task 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 testUser = userManager.FindByEmailAsync(email);
        testUser.Wait();

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

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

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

    }

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

Комментарии (2)

Я использую этот (Ди):

public class IdentitySeed
{
    private readonly ApplicationDbContext _context;
    private readonly UserManager _userManager;
    private readonly RoleManager _rolesManager;
    private readonly ILogger _logger;

    public IdentitySeed(
        ApplicationDbContext context,
        UserManager userManager,
        RoleManager roleManager,
         ILoggerFactory loggerFactory) {
        _context = context;
        _userManager = userManager;
        _rolesManager = roleManager;
        _logger = loggerFactory.CreateLogger();
    }

    public async Task CreateRoles() {
        if (await _context.Roles.AnyAsync()) {// not waste time
            _logger.LogInformation("Exists Roles.");
            return;
        }
        var adminRole = "Admin";
        var roleNames = new String[] { adminRole, "Manager", "Crew", "Guest", "Designer" };

        foreach (var roleName in roleNames) {
            var role = await _rolesManager.RoleExistsAsync(roleName);
            if (!role) {
                var result = await _rolesManager.CreateAsync(new ApplicationRole { Name = roleName });
                //
                _logger.LogInformation("Create {0}: {1}", roleName, result.Succeeded);
            }
        }
        // administrator
        var user = new ApplicationUser {
            UserName = "Administrator",
            Email = "something@something.com",
            EmailConfirmed = true
        };
        var i = await _userManager.FindByEmailAsync(user.Email);
        if (i == null) {
            var adminUser = await _userManager.CreateAsync(user, "Something*");
            if (adminUser.Succeeded) {
                await _userManager.AddToRoleAsync(user, adminRole);
                //
                _logger.LogInformation("Create {0}", user.UserName);
            }
        }
    }
    //! By: Luis Harvey Triana Vega
}
Комментарии (1)

Следующий код будет работать с ISA.


    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, 
        IServiceProvider serviceProvider)
    {
        loggerFactory.AddConsole(Configuration.GetSection("Logging"));
        loggerFactory.AddDebug();

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

        app.UseStaticFiles();

        app.UseIdentity();

        // Add external authentication middleware below. To configure them please see https://go.microsoft.com/fwlink/?LinkID=532715

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

        CreateRolesAndAdminUser(serviceProvider);
    }

    private static void CreateRolesAndAdminUser(IServiceProvider serviceProvider)
    {
        const string adminRoleName = "Administrator";
        string[] roleNames = { adminRoleName, "Manager", "Member" };

        foreach (string roleName in roleNames)
        {
            CreateRole(serviceProvider, roleName);
        }

        // Get these value from "appsettings.json" file.
        string adminUserEmail = "someone22@somewhere.com";
        string adminPwd = "_AStrongP1@ssword!";
        AddUserToRole(serviceProvider, adminUserEmail, adminPwd, adminRoleName);
    }

    /// 
    /// Create a role if not exists.
    /// 
    /// <param name="serviceProvider">Service ProviderRole NameService ProviderUser EmailUser Password. Used to create the user if not exists.Role Name
Комментарии (0)

В дополнение к Тэми Lajumoke'ы ответьте, это's стоит отметить, что после создания необходимых ролей и назначении их конкретным пользователям в ASP.NET ядро 2.1 в MVC веб-приложение, после запуска приложения, вы можете столкнуться с методом проб и ошибок, таких как регистрация или Управление учетной записью:

InvalidOperationException: не удается разрешить сервис для тип 'корпорация Майкрософт.AspNetCore.Идентичности.Пользовательского интерфейса.Услуги.IEmailSender' а попытке активации 'веб-приложения.Местах.Идентичности.Страниц.Счета.Управлять.IndexModel'.

Подобные ошибки могут быть быстро исправлены в методе ConfigureServices путем добавления AddDefaultUI() метод:

services.AddIdentity()
//services.AddDefaultIdentity()
    .AddEntityFrameworkStores()
    .AddDefaultUI()
    .AddDefaultTokenProviders();

Проверить

 https://blogs.msdn.microsoft.com/webdev/2018/03/02/aspnetcore-2-1-identity-ui/

и родственные темы на GitHub:

 https://github.com/aspnet/Docs/issues/6784 для получения дополнительной информации.

И для назначения ролей для конкретного пользователя может быть использован класс IdentityUser вместо ApplicationUser.

Комментарии (0)