我有一个使用Asp.net Core Identity的小型测试应用程序。 在启动时,我检查某些系统角色是否到位:
if(await _roleManager.FindByNameAsync(“SYSADMIN”) == null)
{
_context.Roles.Add(new IdentityRole(“SYSADMIN”));
await _context.SaveChangesAsync();
}
然后我检查并创建一个系统管理员帐户(如果它不存在):
var result = await _userManager.CreateAsync(adminUser, config["AdminPassword"]);
然后我尝试将该用户添加到SYSADMIN角色:
if (result == IdentityResult.Success)
{
await _userManager.AddToRoleAsync(adminUser, “SYSADMIN”);
}
但得到该角色不存在的错误。但是,我可以在AspNetRoles
中看到具有上述名称的角色,当我第二次运行该应用时,它不会进入_context.Roles.Add()
部分,因为_roleManager.FindByNameAsync
返回作用。
之前有没有人见过这种行为,或者知道为什么会失败?
修改 我注意到,虽然在DB中,NormalisedName为null - 它是用来匹配的吗?
答案 0 :(得分:3)
所以这看起来像是一个错误。如果使用仅包含字符串的构造函数,则会填充名称,但不会填充规范化名称。似乎规范化的名称在AddToRoleAsync
中匹配,因此它永远不会起作用。
我需要使用以下命令强制填充NormalizedName:
_context.Roles.Add(new IdentityRole("SYSADMIN")
{
NormalizedName = "SYSADMIN"
});
现在正在努力。 我会向团队提交一个错误,希望它能得到解决。