Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net core 我们可以在ASP.NET标识中使用硬编码角色吗?_Asp.net Core_Asp.net Identity - Fatal编程技术网

Asp.net core 我们可以在ASP.NET标识中使用硬编码角色吗?

Asp.net core 我们可以在ASP.NET标识中使用硬编码角色吗?,asp.net-core,asp.net-identity,Asp.net Core,Asp.net Identity,我对ASP.NET身份还不熟悉,正在与角色作斗争。我以前在桌面应用程序中的经验(我们显然不能使用ASP.NET身份,主要是滚动我们自己的角色),我们通常为角色添加enum。这使我们能够在代码中明确地引用它们 ASP.NET标识似乎需要存储在数据库中的角色。我的主要问题是,我们不能保证每个人(所有开发人员、测试和生产数据库)在我们的数据库中都有相同的数据。通过使用枚举,数据在代码中硬编码,因此不存在歧义的可能性 第二个(但仍然非常重要)问题是角色似乎依赖于您使用硬编码字符串 [Authorize(

我对ASP.NET身份还不熟悉,正在与角色作斗争。我以前在桌面应用程序中的经验(我们显然不能使用ASP.NET身份,主要是滚动我们自己的角色),我们通常为角色添加
enum
。这使我们能够在代码中明确地引用它们

ASP.NET标识似乎需要存储在数据库中的角色。我的主要问题是,我们不能保证每个人(所有开发人员、测试和生产数据库)在我们的数据库中都有相同的数据。通过使用
枚举
,数据在代码中硬编码,因此不存在歧义的可能性

第二个(但仍然非常重要)问题是角色似乎依赖于您使用硬编码字符串

[Authorize(Roles = "SomeRole")]
public IActionResult SomeAction() =>
  View();
这似乎很脆弱。角色名称很容易输入错误,如果我们想更改名称呢?我们必须找到硬编码字符串的每个实例并对其进行更改

为了澄清,角色被用来限制对网站某些区域的访问。我们将有一套固定的角色,这些角色很少会改变。如果它们确实改变了,代码也需要随之改变,因此动态访问角色(例如通过站点的CRUD部分)是毫无意义的


我们可以这样做吗?如果没有,我们如何避开知道如何引用可能不存在的角色的问题?

为了避免键入错误,您可以尝试
const

  • 劳力康斯特

    public class RoleConst
    {
        public const string Admin = "Admin";
        public const string User = "User";
    }
    
  • 插入角色

    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>();
    }
    

  • 为了避免输入错误,您可以尝试
    const

  • 劳力康斯特

    public class RoleConst
    {
        public const string Admin = "Admin";
        public const string User = "User";
    }
    
  • 插入角色

    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>();
    }
    

  • 这真聪明!我不知道您可以创建具有固定值的角色。我现在不在我的电脑上,所以还不能尝试,但我会试试看它是如何工作的。Thanks@AvrohomYisroel“创建具有固定值的角色”是什么意思?我认为角色是通过其ID来引用的,就像主键为Identity(1,1)时的数据库行一样,这意味着不同的开发人员可能有不同的ID。我不知道你可以通过名字来引用角色,所以如果我们使用常量(如你所示),我们可以避免这个问题。现在这很聪明!我不知道您可以创建具有固定值的角色。我现在不在我的电脑上,所以还不能尝试,但我会试试看它是如何工作的。Thanks@AvrohomYisroel“创建具有固定值的角色”是什么意思?我认为角色是通过其ID来引用的,就像主键为Identity(1,1)时的数据库行一样,这意味着不同的开发人员可能有不同的ID。我不知道你可以通过名字来引用角色,所以如果我们使用常量(如你所示),我们可以避免这个问题。