Можем ли мы иметь жестко запрограммированные роли в ASP.NET Identity? - PullRequest
0 голосов
/ 03 мая 2019

Я новичок в ASP.NET Identity и борюсь с ролями. Мой предыдущий опыт работы с настольными приложениями (где мы явно не могли использовать ASP.NET Identity и в основном катали свои собственные роли), и мы обычно добавляли enum для ролей. Это позволило нам однозначно сослаться на них в коде.

Для идентификации ASP.NET необходимы роли, хранящиеся в базе данных. Моя главная проблема в том, что мы не можем гарантировать, что все (все разработчики, тестовая и производственная базы данных) будут иметь одинаковые данные в наших базах данных. Используя enum, данные жестко кодируются в коде, поэтому нет никакой двусмысленности.

Вторичная (но все еще очень важная) проблема заключается в том, что роли, похоже, полагаются на вас, используя жестко закодированные строки ...

[Authorize(Roles = "SomeRole")]
public IActionResult SomeAction() =>
  View();

Это кажется хрупким. Слишком легко напечатать название роли, а что если мы захотим изменить имя? Мы должны были бы выследить каждый экземпляр жестко запрограммированной строки и изменить его.

Для пояснения, роли используются для ограничения доступа к определенным областям веб-сайта. У нас будет фиксированный набор ролей, который будет редко меняться. Если они меняются, код должен будет меняться вместе с ними, поэтому динамический доступ к ролям (например, через раздел CRUD сайта) не имеет смысла.

Можем ли мы сделать это? Если нет, то как нам обойти проблему знания того, как ссылаться на роли, которые могут не существовать?

1 Ответ

2 голосов
/ 03 мая 2019

Чтобы избежать опечатки, вы можете попробовать const.

  1. RoleConst

    public class RoleConst
    {
        public const string Admin = "Admin";
        public const string User = "User";
    }
    
  2. Вставить роль

    public class Program
    {
        public static void Main(string[] args)
        {
            //CreateWebHostBuilder(args).Build().Run();
            var host = CreateWebHostBuilder(args).Build();
            using (var scope = host.Services.CreateScope())
            {
                var services = scope.ServiceProvider;
                try
                {
                    RoleManager<IdentityRole> roleManager = services.GetRequiredService<RoleManager<IdentityRole>>();
                    if(roleManager.Roles.Count() == 0)
                    {
                        //insert role
                        roleManager.CreateAsync(new IdentityRole(RoleConst.Admin)).ConfigureAwait(true);
                        roleManager.CreateAsync(new IdentityRole(RoleConst.User)).ConfigureAwait(true);
                    }
                }
                catch (Exception ex)
                {
                    var logger = services.GetRequiredService<ILogger<Program>>();
                    logger.LogError(ex, "An error occurred while seeding the database.");
                }
            }
    
            host.Run();
        }
    
        public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseStartup<Startup>();
    }
    
  3. Использовать Authorize сRole

    [Authorize(Roles = RoleConst.Admin)]
    public IActionResult Privacy()
    {
        return View();
    }
    
...