我是ASP.NET Identity的新手,并且在角色方面挣扎。我以前在台式机应用程序中的经验(我们显然不能使用ASP.NET身份,并且主要扮演自己的角色),通常为角色添加enum
。这使我们能够在代码中明确引用它们。
ASP.NET Identity似乎需要存储在数据库中的角色。我的主要问题是,我们不能保证每个人(所有开发人员,测试和生产数据库)在我们的数据库中都拥有相同的数据。通过使用enum
,数据将被硬编码在代码中,因此不会产生歧义。
另一个(但仍然很重要)的问题是,角色似乎依赖于您使用硬编码的字符串...
[Authorize(Roles = "SomeRole")]
public IActionResult SomeAction() =>
View();
这似乎很脆弱。错误键入角色名称太容易了,如果我们想更改名称怎么办?我们必须找出每个硬编码字符串的实例并进行更改。
为澄清起见,正在使用角色来限制对网站某些区域的访问。我们将拥有一组固定的角色,这些角色几乎不会改变。如果确实发生更改,则代码也需要随之更改,因此动态访问角色(例如通过站点的CRUD部分)是毫无意义的。
我们可以这样做吗?如果没有,我们如何解决知道如何引用可能不存在的角色的问题?
答案 0 :(得分:2)
为避免输入错误,您可以尝试const
。
RoleConst
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
与Role
一起使用
[Authorize(Roles = RoleConst.Admin)]
public IActionResult Privacy()
{
return View();
}