【发布时间】:2016-11-23 12:56:36
【问题描述】:
我有一个使用 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 返回角色。
以前有没有人见过这种行为,或者知道它失败的原因?
编辑 我注意到 NormalisedName 虽然在数据库中为 null - 这是它用来匹配的内容吗?
【问题讨论】:
-
在我看来,您在前后不一致并试图预先规范化角色名称。如果 IDPPlatform.System.Roles.OrgAdmin 是一个字符串常量,可以规范化为 SYSADMIN 你应该在任何地方都使用这个常量。 _roleManager.FindByNameAsync 之类的方法将在方法内部对其进行规范化,因此您无需对其进行预规范化。与 _userManager.AddToRoleAsync 相同
-
抱歉,这是一个复制/粘贴错误。它确实解析为“SYSADMIN”,并且该常量确实在任何地方都使用,我只是在此示例中替换了它以显示它解析的内容,因为它是放在 SQL Server 中 name 列中的字符串。我注意到 NormalisedName 虽然在数据库中为空 - 这是它用来匹配的内容吗?
标签: asp.net-core asp.net-identity-3