我们可以在 ASP.NET Identity 中硬编码角色吗?

问题描述 投票:0回答:1

我是 ASP.NET Identity 的新手,正在为角色而苦苦挣扎。我之前在桌面应用程序中的经验(我们显然无法使用 ASP.NET Identity,并且主要滚动我们自己的角色),并且我们通常为角色添加

enum
。这使我们能够在代码中明确地引用它们。

ASP.NET Identity 似乎需要存储在数据库中的角色。我的主要问题是,我们不能保证每个人(所有开发人员、测试和生产数据库)在我们的数据库中都拥有相同的数据。通过使用

enum
,数据被硬编码在代码中,因此不可能出现歧义。

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

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

这看起来很脆弱。角色名称很容易输错,如果我们想更改名称怎么办?我们必须找到硬编码字符串的每个实例并更改它。

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

我们可以这样做吗?如果不是,我们如何解决知道如何引用可能不存在的角色的问题?

asp.net-core asp.net-identity
1个回答
3
投票

为避免输入错误,您可以尝试使用

const
而不是
enum

角色构造

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

Authorize
RoleConst

一起使用
[Authorize(Roles = RoleConst.Admin)]
public IActionResult Privacy()
{
    return View();
}
© www.soinside.com 2019 - 2024. All rights reserved.